协慌网

登录 贡献 社区

Python`if x is not None` 或 `if not x is None`?

我一直想着if not x is None版本会更清楚,但是if x is not None ,则谷歌的样式指南PEP-8都会使用。是否存在任何微小的性能差异(我假设没有),并且在任何情况下确实不适合(使另一方成为我的会议的明显获胜者)吗?*

* 我指的是任何单身人士,而不是None

... 比较单例,如 “无”。使用是或不是。

答案

性能没有差别,因为它们可以编译为相同的字节码:

>>> import dis
>>> dis.dis("not x is None")
  1           0 LOAD_NAME                0 (x)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE
>>> dis.dis("x is not None")
  1           0 LOAD_NAME                0 (x)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE

从风格上讲,我尽量避免not x is y ,人类读者可能会误(not x) is y 。如果我写x is not y那么就不会有歧义。

Google 和Python的样式指南都是最佳做法:

if x is not None:
    # Do something about x

not x使用 x 可能会导致不良结果。

见下文:

>>> x = 1
>>> not x
False
>>> x = [1]
>>> not x
False
>>> x = 0
>>> not x
True
>>> x = [0]         # You don't want to fall in this one.
>>> not x
False

您可能有兴趣查看在 Python 中TrueFalse


编辑下面的评论:

我只是做了一些测试。 not x is None不会x ,然后再将其与None进行比较。 is运算符时,它似乎具有更高的优先级:

>>> x
[0]
>>> not x is None
True
>>> not (x is None)
True
>>> (not x) is None
False

因此,我诚实地认为,最好not x is None


更多编辑:

我只是做了更多的测试,可以确认 bukzor 的评论是正确的。 (至少,我无法证明这一点。)

这意味着, if x is not None则得到准确的结果,就if not x is None 。我站得住了。谢谢布克佐。

但是,我的答案仍然成立: if x is not None使用常规方法:]

应该首先编写代码,以便程序员首先可以理解,然后再编译器或解释器理解。 “不是” 结构比 “不是” 更像英语。