-
HUX布斯
if val is not None: # ...是用于测试未将变量设置为的Python惯用法None。在用默认参数声明关键字函数的情况下,该惯用法有特殊用途。is在Python中测试身份。因为None正在运行的Python脚本/程序中只有一个实例,所以这是is最佳测试。正如Johnsyweb指出的那样,这在PEP 8中的 “编程建议”中进行了讨论。至于为什么这是首选if not (val is None): # ...这只是Python Zen的一部分:“可读性很重要”。好的Python通常接近好的伪代码。
-
幕布斯6054654
来自PEP 8编程建议:与单例(如None)的比较应始终使用“是”或“不是”进行,永远不要使用相等运算符进行。另外,当您真正的意思是“如果x不是None”时,要当心写“ if x”-例如,在测试是否将默认为None的变量或参数设置为其他值时。另一个值可能具有在布尔上下文中可能为false的类型(例如容器)!对于任何Python程序员来说,PEP 8都是必不可少的书籍。
-
智慧大石
这些问题的最佳选择是确切地了解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请注意,最后两种情况简化为相同的操作顺序(python读取not (val is None)并使用该is not运算符)。!=与无比较时,第一个使用运算符。正如其他答案所指出的那样,!=在与“无”进行比较时使用“