除非我疯了,if None not in x
和if not None in x
相同。有首选版本吗?我猜None not in
更像英语,因此更加pythonic,但not None in
更像其他语言语法。有首选版本吗?
答案 0 :(得分: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
documentation也清楚地表明两者是等价的:
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
,则没有歧义。
答案 1 :(得分:7)
表达式
not (None in x)
(为清晰起见而添加的parens)是一个普通的布尔否定。然而,
None not in x
是为更易读的代码添加的特殊语法(这里没有可能,也没有意义,在in前面使用和,等等)。如果添加了这种特殊情况,请使用它。
同样适用于
foo is not None
VS
not foo is None
我发现阅读“不是”更清楚。作为额外的奖励,如果表达式是更大的布尔表达式的一部分,则not的范围立即清楚。