我一直认为如果不是x是None版本更清楚,但谷歌的风格指南和PEP-8都使用如果x不是None。是否存在任何微小的性能差异(我假设没有),是否存在其中一个确实不适合的情况(使另一个成为我的大会的明显赢家)?*
*我指的是任何单例,而不仅仅是None。
...比较单身人士喜欢 一个也没有。使用是或不是。
我一直认为如果不是x是None版本更清楚,但谷歌的风格指南和PEP-8都使用如果x不是None。是否存在任何微小的性能差异(我假设没有),是否存在其中一个确实不适合的情况(使另一个成为我的大会的明显赢家)?*
*我指的是任何单例,而不仅仅是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
在文体上,我尽量避免“不是x是y”,人类读者可能会误解为“(不是x)是y”。如果我写“x不是y”,那么就没有歧义。
其他回答
它们没有性能差异,因为它们编译为相同的字节码:
>>> 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
在文体上,我尽量避免“不是x是y”,人类读者可能会误解为“(不是x)是y”。如果我写“x不是y”,那么就没有歧义。
谷歌和Python的风格指南都是最佳实践:
if x is not None:
# Do something about 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中哪些文字被赋值为True或False:
真值检验
编辑评论如下:
我刚刚又做了些测试。not x是None不先否定x,然后与None比较。事实上,在这样使用时,is操作符似乎有更高的优先级:
>>> x
[0]
>>> not x is None
True
>>> not (x is None)
True
>>> (not x) is None
False
因此,在我看来,None是最好避免的。
更多的编辑:
我刚刚做了更多的测试,可以确认bukzor的评论是正确的。(至少,我无法证明这一点。)
这意味着如果x不是None,则结果与如果x不是None相同。我接受纠正。谢谢bukzor。
然而,我的回答仍然有效:如果x不为None,则使用常规。:]
就我个人而言,我使用
if not (x is None):
每个程序员都能立即理解,没有歧义,即使那些不是Python语法专家。
我更喜欢更容易读懂的形式x不是y 而不是思考如何最终编写处理操作符优先级的代码,以产生更可读的代码。
如果不是x is, None更类似于其他编程语言,但如果x不是,None对我来说听起来肯定更清楚(而且英语语法更正确)。
也就是说,对我来说,这似乎更像是一种偏好。