Python`如果x不是None`或`if not x is None`?

oro*_*aki 687 python coding-style boolean-expression

我一直认为if not x is None版本更清晰,但谷歌的风格指南PEP-8都使用if x is not None.是否存在任何轻微的性能差异(我假设没有),是否存在任何一个真正不合适的情况(使另一个成为我公约的明显赢家)?*

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

...比较像无的单身人士.使用是否.

Dan*_*ach 927

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

Python 2.6.2 (r262:71600, Apr 15 2009, 07:20:39)
>>> import dis
>>> def f(x):
...    return x is not None
...
>>> dis.dis(f)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE
>>> def g(x):
...   return not x is None
...
>>> dis.dis(g)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               0 (None)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)

在风格上,我尽量避免not x is y.尽管编译器总是将其视为not (x is y),但人类读者可能会误解构造(not x) is y.如果我写,x is not y那么没有歧义.

  • 除非同一个人类读者认为它是"x是(不是y)".但我倾向于同意你的其他推理. (94认同)
  • 另外"is not"在这种情况下不那么模糊"如果a不是None而b是None:"vs"如果不是a是None而b是None:" (22认同)
  • 操作员应该“胆小” (22认同)
  • 或“除非”(“如果不是 x 为 None”->“除非 x 为 None”) (2认同)
  • 我认为事实恰恰相反。当我第一次看到“x is not y”时,我以为程序员正在将 x 与“not y”进行比较。 (2认同)

Xav*_* Ho 180

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

if x is not None:
    # Do something about x
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

您可能有兴趣了解在Python中TrueFalse在Python 中评估的文字:

编辑以下评论:

我刚做了一些测试.not x is None是没有x先不否定然后比较None.实际上,is当使用这种方式时,运算符似乎具有更高的优先级:

>>> x
[0]
>>> not x is None
True
>>> not (x is None)
True
>>> (not x) is None
False
Run Code Online (Sandbox Code Playgroud)

因此,not x is None在我的诚实意见中,最好避免.

更多编辑:

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

这意味着if x is not None具有确切的结果if not x is None.我纠正了.谢谢bukzor.

但是,我的回答仍然是:使用传统的if x is not None.:]


Mar*_*som 126

代码应该首先编写为程序员可以理解,然后编译器或解释器编写."不是"构造比"不是"更接近英语.

  • “*代码应该首先写成程序员可以理解的*”:这是设计 COBOL 的原则,COBOL 是一种来自非学术界的语言,受到了很多[学术界的屈尊俯就](http://www.cs.umd. edu/~ben/papers/Schneiderman1985Relationship.pdf),有些是合法的,大多数不是。至于原因……“*对于一个计算机科学家来说,同情 COBOL 的行为近乎异端。这需要勇气,因为学术同事和数据处理专业人士都可能怀疑我的动机。*” (3认同)
  • 直到并且除非它不影响性能!! (2认同)

Gle*_*ard 30

答案比人们做得简单得多.

有没有技术优势无论哪种方式,而"x是不是Y"是什么其他人使用,这使得它明显的赢家.它"看起来更像英语"并不重要; 每个人都使用它,这意味着Python中的每个用户-即使中国用户,其语言Python的看上去一点也不像-将一目了然,其中不太常用的语法将需要几个额外的大脑周期来分析理解.

不要只是为了与众不同,至少在这个领域是不同的.


Aar*_*all 30

Python if x is not None还是if not x is None

TLDR:字节码编译器将它们都解析为x is not None- 所以为了便于阅读,请使用if x is not None.

可读性

我们使用Python是因为我们重视人的可读性,可用性以及各种编程范式对性能的正确性.

Python优化了可读性,尤其是在此上下文中.

解析和编译字节码

not 结合更弱is,所以这里没有逻辑的差异.查看文档:

对象标识的运算符isis not测试:x is y当且仅当x和y是同一个对象时才为真.x is not y产生反向真值.

is not有具体规定,在Python 语法作为语言可读性改善:

comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'
Run Code Online (Sandbox Code Playgroud)

所以它也是语法的单一元素.

当然,它没有被解析:

>>> import ast
>>> ast.dump(ast.parse('x is not None').body[0].value)
"Compare(left=Name(id='x', ctx=Load()), ops=[IsNot()], comparators=[Name(id='None', ctx=Load())])"
>>> ast.dump(ast.parse('not x is None').body[0].value)
"UnaryOp(op=Not(), operand=Compare(left=Name(id='x', ctx=Load()), ops=[Is()], comparators=[Name(id='None', ctx=Load())]))"
Run Code Online (Sandbox Code Playgroud)

但是字节编译器实际上将转换not ... isis not:

>>> import dis
>>> dis.dis(lambda x, y: x is not y)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE
>>> dis.dis(lambda x, y: not x is y)
  1           0 LOAD_FAST                0 (x)
              3 LOAD_FAST                1 (y)
              6 COMPARE_OP               9 (is not)
              9 RETURN_VALUE
Run Code Online (Sandbox Code Playgroud)

因此,为了便于阅读和使用预期的语言,请使用is not.

不使用它不明智的.


Mik*_*ham 11

出于风格原因,is not操作者优先于否定结果is." if x is not None:"读起来就像英语,但" if not x is None:"需要理解运算符优先级,而不是像英语那样读.

如果我的钱存在性能差异is not,但这几乎肯定不是决定更喜欢这种技术的动机.它显然是依赖于实现的.由于is不可覆盖,无论如何都应该很容易优化任何区别.


Mik*_*TeX 9

就个人而言,我用

if not (x is None):
Run Code Online (Sandbox Code Playgroud)

每个程序员都可以立即理解,即使是那些不熟悉Python语法的程序员.

  • 一个公平的论点,我同意,但我相信遵循惯用风格的论点更强. (5认同)