除了这些没有测试。
if val != None: if not (val is None): if val is not None:
哪一个更好,为什么?
后两者中的任何一个,因为val可能是定义__eq__()的类型,当传递None时返回true。
val
__eq__()
None
if val is not None:# ...
是Pythonic惯用语,用于测试变量未设置为None。这个惯用语在使用默认参数声明关键字函数的情况下有特殊用途。is在Python中测试身份。因为在运行的Python脚本/程序中只有一个None实例,所以is是对此的最佳测试。作为Johnsyweb指出,这在PEP 8的“编程建议”下讨论。
is
至于为什么这是首选
if not (val is None):# ...
这只是Python之禅的一部分:“可读性很重要”。好的Python通常接近好的伪码。
来自,编程建议,PEP 8:
与像无这样的单例的比较应该始终使用is或is not来完成,而不是相等运算符。另外,当心当你真正指的是if x is not None时写if x-例如在测试默认为无的变量或参数是否设置为其他值时。其他值可能具有在布尔上下文中可能为false的类型(例如容器)!
与像无这样的单例的比较应该始终使用is或is not来完成,而不是相等运算符。
is not
另外,当心当你真正指的是if x is not None时写if x-例如在测试默认为无的变量或参数是否设置为其他值时。其他值可能具有在布尔上下文中可能为false的类型(例如容器)!
if x is not None
if x
PEP 8对于任何Python程序员来说都是必不可少的读物。
这些类型问题的最佳选择是确切地了解python的作用。dis模块信息丰富:
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操作符。
not (val is None)
正如其他答案所指出的,在与None进行比较时使用!=是一个坏主意。
!=