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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python`如果x不是None`或`if not x is None`?相关的知识,希望对你有一定的参考价值。

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

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

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

答案

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

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

在风格上,我尽量避免使用not x is y。尽管编译器总是将其视为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 = 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的确切结果。我纠正了。谢谢bukzor。

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

另一答案

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

另一答案

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

无论哪种方式都没有技术优势,“x不是y”是其他人使用的,这使它成为明显的赢家。它“看起来更像英语”并不重要;每个人都使用它,这意味着Python的每个用户 - 甚至是中文用户,其语言Python看起来都不像 - 将一目了然地理解它,其中稍微不那么常见的语法需要花费几个额外的脑循环来解析。

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

另一答案

Python if x is not None or if not x is None?

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

可读性

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

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

解析和编译字节码

not binds more weaklyis,所以这里没有逻辑上的区别。见documentation

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

is not是Python grammar中专门提供的,作为语言的可读性改进:

comp_op: '<'|'>'|'=='|'>='|'<='|'<>'|'!='|'in'|'not' 'in'|'is'|'is' 'not'

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

当然,它没有被解析:

>>> 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())]))"

但是字节编译器实际上会将not ... is转换为is 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

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

不使用它是不明智的。

另一答案

由于风格原因,is not算子优于否定is的结果。 “if x is not None:”读起来就像英语,但“if not x is None:”需要理解运算符优先级,而不是像英语那样读。

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

另一答案

就个人而言,我用

if not (x is None):

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

另一答案

if not x is None更类似于其他编程语言,但if x is not None对我来说肯定听起来更清晰(并且在语法上更正确)。

这说对我来说似乎更偏向于它。

另一答案

我更喜欢x is not y更易读的形式,而不是我想如何最终编写运算符的代码处理优先级以产生更易读的代码。

以上是关于Python`如果x不是None`或`if not x is None`?的主要内容,如果未能解决你的问题,请参考以下文章

python代码`if not x:` 和`if x is not None:`和`if not x is None:`使用

python is not None

if...not...

python if not

在 Python 2.7 中检查字符串“None”或“not”

兄弟连学python(26) --- if not