我一直认为如果不是x是None版本更清楚,但谷歌的风格指南和PEP-8都使用如果x不是None。是否存在任何微小的性能差异(我假设没有),是否存在其中一个确实不适合的情况(使另一个成为我的大会的明显赢家)?*

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

...比较单身人士喜欢 一个也没有。使用是或不是。


当前回答

如果不是x is, None更类似于其他编程语言,但如果x不是,None对我来说听起来肯定更清楚(而且英语语法更正确)。

也就是说,对我来说,这似乎更像是一种偏好。

其他回答

我更喜欢更容易读懂的形式x不是y 而不是思考如何最终编写处理操作符优先级的代码,以产生更可读的代码。

由于风格原因,使用is not运算符比对is的结果求反更可取。"if x is not None:"读起来就像英语,但"if not x is None:"需要理解操作符优先级,读起来不像英语。

如果存在性能差异,我的赌注是没有,但这几乎肯定不是选择这种技术的动机。它显然是依赖于实现的。由于is是不可重写的,因此无论如何都应该很容易优化出任何区别。

Python如果x不是None或如果不是x是None?

TLDR:字节码编译器将它们都解析为x不是None -因此为了可读性,使用if x不是None。

可读性

我们使用Python是因为我们重视人类的可读性、可用性和各种编程范式的正确性,而不是性能。

Python优化了可读性,特别是在这个上下文中。

解析和编译字节码

not的绑定比is更弱,所以这里没有逻辑上的区别。参见文档:

操作符is和is not测试对象的同一性:x是y是真 当且仅当x和y是同一个对象。X不是y会得到 逆真值。

is not是Python语法中专门提供的,用于提高语言的可读性:

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

但是字节编译器实际上会翻译不是。是不是:

>>> 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。

不使用它是不明智的。

谷歌和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语法专家。