从这些非None测试中。

if val != None:

if not (val is None):

if val is not None:

哪一个更可取,为什么?


当前回答

后两者中的任何一个,因为val可能是一种类型,该类型将__eq__()定义为在传递None时返回true。

其他回答

摘自,编程建议,PEP 8:

与None这样的单例对象的比较总是应该使用is或is not,而不是相等操作符。 另外,注意当你真正的意思是如果x不是None时写if x——例如,当测试一个默认为None的变量或参数是否被设置为其他值时。另一个值的类型(比如容器)在布尔上下文中可能是假的!

PEP 8对于任何Python程序员来说都是必不可少的读物。

回答这类问题最好的办法是看看python到底是怎么做的。dis模块提供了非常丰富的信息:

>>> import dis
>>> dis.dis("val != None")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               3 (!=)
              6 RETURN_VALUE
>>> dis.dis("not (val is None)")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE
>>> dis.dis("val is not None")
  1           0 LOAD_NAME                0 (val)
              2 LOAD_CONST               0 (None)
              4 COMPARE_OP               9 (is not)
              6 RETURN_VALUE

注意,最后两种情况减少到相同的操作序列,Python读取not (val为None)并使用is not操作符。第一个在与None比较时使用!=操作符。

正如其他答案所指出的,在与None进行比较时使用!=是一个坏主意。

if val is not None:
    # ...

是python习语,用于测试变量是否未设置为None。这种习惯用法在使用默认参数声明关键字函数的情况下有特殊用途。在Python中测试身份。因为在运行的Python脚本/程序中有且只有一个None实例,所以is是最佳测试。正如Johnsyweb指出的,这在PEP 8的“编程建议”一节中进行了讨论。

至于为什么这是首选

if not (val is None):
    # ...

这只是Python的禅的一部分:“可读性很重要。”好的Python通常接近于好的伪代码。

后两者中的任何一个,因为val可能是一种类型,该类型将__eq__()定义为在传递None时返回true。