不是在Python中无testing
这些不是没有testing。
if val != None: if not (val is None): if val is not None:
哪一个更好,为什么?
if val is not None: # ...
是testingvariables没有设置为None
的Pythonic成语。 这个习语在使用默认参数声明关键字函数的情况下具有特殊用途。 在Python中testing身份。 因为在正在运行的Python脚本/程序中只有一个None
实例,所以is
是最佳的testing。 正如Johnsyweb所指出的那样 , PEP 8在“编程build议”中对此进行了讨论。
至于为什么这是首选
if not (val is None): # ...
这只是Python的禅宗的一部分:“可读性计数”。 良好的Python往往接近良好的伪代码 。
来自,编程build议, PEP 8 :
像None这样的单身人士的比较应该总是用'is'或'is not'来完成,而不是平等运算符。
另外,当你真正的意思是“如果x不是无”时,要小心写“if x” – 例如,当testing一个variables或默认为None的参数是否被设置为其他值。 另一个值可能有一个types(如一个容器),在布尔上下文中可能是false!
PEP 8对于任何Python程序员来说都是必不可less的。
后两者中的任何一个,因为val
可能是一个定义__eq__()
的types,当传递None
时返回true。
与这些types的问题最好的赌注是确切地看到什么python。 dis
模块的信息非常丰富:
>>> def f(val): ... if val != None: ... return True ... return False ... >>> def g(val): ... if not (val is None): ... return True ... return False ... >>> def h(val): ... if val is not None: ... return True ... return False ... >>> import dis >>> dis.dis(f) 2 0 LOAD_FAST 0 (val) 3 LOAD_CONST 0 (None) 6 COMPARE_OP 3 (!=) 9 POP_JUMP_IF_FALSE 16 3 12 LOAD_GLOBAL 1 (True) 15 RETURN_VALUE 4 >> 16 LOAD_GLOBAL 2 (False) 19 RETURN_VALUE >>> dis.dis(g) 2 0 LOAD_FAST 0 (val) 3 LOAD_CONST 0 (None) 6 COMPARE_OP 9 (is not) 9 POP_JUMP_IF_FALSE 16 3 12 LOAD_GLOBAL 1 (True) 15 RETURN_VALUE 4 >> 16 LOAD_GLOBAL 2 (False) 19 RETURN_VALUE >>> dis.dis(h) 2 0 LOAD_FAST 0 (val) 3 LOAD_CONST 0 (None) 6 COMPARE_OP 9 (is not) 9 POP_JUMP_IF_FALSE 16 3 12 LOAD_GLOBAL 1 (True) 15 RETURN_VALUE 4 >> 16 LOAD_GLOBAL 2 (False) 19 RETURN_VALUE
请注意,最后两种情况减less到相同的操作序列(python读取not (val is None)
并使用is not
操作符)。 与None比较时,第一个使用!=
运算符。
正如其他答案指出的那样,使用!=
和None比较是一个坏主意