Python“如果x不是None”或“如果不是x is None”?[已关闭]

我一直认为版本更清晰,但是Google的风格指南PEP-8都使用.是否有任何微小的性能差异(我假设没有),是否有任何情况,其中一个真的不适合(使另一个成为我的大会的明显赢家)?if not x is Noneif x is not None

*我指的是任何单例,而不仅仅是.None

...比较像 None 这样的单例。使用是或不是。


答案 1

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

>>> 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 yx is not y


答案 2

Google和Python的风格指南都是最佳实践:

if x is not None:
    # Do something about x

使用可能会导致不需要的结果。not 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 NonexNoneis

>>> 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 Noneif not x is None

但是,我的答案仍然成立:如果x不是None,则使用常规方法。:]