在Python中没有测试

除了这些没有测试。

if val != None:
if not (val is None):
if val is not None:

哪一个更好,为什么?

1090114 次浏览

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

if val is not None:# ...

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

至于为什么这是首选

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

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

来自,编程建议,PEP 8

与像无这样的单例的比较应该始终使用isis not来完成,而不是相等运算符。

另外,当心当你真正指的是if x is not None时写if x-例如在测试默认为无的变量或参数是否设置为其他值时。其他值可能具有在布尔上下文中可能为false的类型(例如容器)!

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 is None)并使用#1操作员。与None相比,第一种使用#2操作符

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