"None not in"与"not None in"的区别

7

除非我疯了,if None not in xif not None in x是等效的。是否有首选版本?我猜None not in更具英语特色,因此更符合Pythonic,但not None in更像其他语言的语法。是否有首选版本?


2
请参见https://dev59.com/GnE85IYBdhLWcg3wkkfK。 - Gumbo
如果您只是将一个运算符更改为另一个运算符,那么许多SO上的问题将成为重复问题。 - Falmarri
2个回答

14

它们编译成相同的字节码,因此它们是等价的。

>>> import dis
>>> dis.dis(lambda: None not in x)
  1           0 LOAD_CONST               0 (None)
              3 LOAD_GLOBAL              1 (x)
              6 COMPARE_OP               7 (not in)
              9 RETURN_VALUE
>>> dis.dis(lambda: not None in x)
  1           0 LOAD_CONST               0 (None)
              3 LOAD_GLOBAL              1 (x)
              6 COMPARE_OP               7 (not in)
              9 RETURN_VALUE

文档也明确说明这两者等价:

x not in s返回x in s的否定。

正如你提到的None not in x更符合英语表达习惯,所以我更喜欢使用它。

如果你写成not y in x,可能不清楚你是指not(y in x)还是(not y) in x。 如果使用not in就没有歧义了。


谢谢,我不知道你可以这样比较字节码。 - Uku Loskit

7
表达式
not (None in x) 

(为了明确起见添加括号)是普通的布尔否定。然而,

None not in x

这是一种为了让代码更易读而添加的特殊语法(在in前面使用and、or等无意义且不可行)。如果需要使用这种特殊情况,请使用它。

同样适用于:

foo is not None

对比。

not foo is None

我认为使用“is not”更容易理解。此外,如果该表达式是更大布尔表达式的一部分,则“not”的范围立即变得清晰明了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接