“无不在”与“无不在”

Posted

技术标签:

【中文标题】“无不在”与“无不在”【英文标题】:"None not in" vs "not None in" 【发布时间】:2011-04-05 23:25:40 【问题描述】:

除非我疯了 if None not in xif not None in x 是等价的。有首选版本吗?我猜None not in 更偏英语,因此更 Pythonic,但not None in 更像其他语言语法。有首选版本吗?

【问题讨论】:

另见***.com/questions/2710940 如果您只是将 1 个运算符更改为另一个运算符,那么很多关于 SO 的问题都会重复 【参考方案1】:

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

>>> 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,则不会有歧义。

【讨论】:

谢谢,不知道你可以这样比较字节码。【参考方案2】:

表达式

not (None in x) 

(为清楚起见添加了括号)是一个普通的布尔否定。然而,

None not in x

是为更易读的代码添加的特殊语法(这里不可能,也没有意义,在 in 前面使用 and,or 等)。如果添加了这种特殊情况,请使用它。

同样适用

foo is not None

对比

not foo is None

我发现“不是”读起来更清楚。另外,如果表达式是较大布尔表达式的一部分,则 not 的范围会立即明确。

【讨论】:

以上是关于“无不在”与“无不在”的主要内容,如果未能解决你的问题,请参考以下文章

读书的意义

存储新图谱:DNA存储的边界与天地

JavaScript入门篇 - 常用互动方法

一文带你速懂虚拟化KVM和XEN

JavaScript入门篇

为大家讲解一下IT的由来