不是在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比较是一个坏主意