3 回答

TA贡献1876条经验 获得超6个赞
if val is not None:
# ...
是用于测试未将变量设置为的Python惯用法None。在用默认参数声明关键字函数的情况下,该惯用法有特殊用途。is在Python中测试身份。因为None正在运行的Python脚本/程序中只有一个实例,所以这是is最佳测试。正如Johnsyweb指出的那样,这在PEP 8中的 “编程建议”中进行了讨论。
至于为什么这是首选
if not (val is None):
# ...
这只是Python Zen的一部分:“可读性很重要”。好的Python通常接近好的伪代码。

TA贡献1876条经验 获得超7个赞
来自PEP 8编程建议:
与单例(如None)的比较应始终使用“是”或“不是”进行,永远不要使用相等运算符进行。
另外,当您真正的意思是“如果x不是None”时,要当心写“ if x”-例如,在测试是否将默认为None的变量或参数设置为其他值时。另一个值可能具有在布尔上下文中可能为false的类型(例如容器)!
对于任何Python程序员来说,PEP 8都是必不可少的书籍。

TA贡献1946条经验 获得超3个赞
这些问题的最佳选择是确切地了解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运算符)。!=与无比较时,第一个使用运算符。
正如其他答案所指出的那样,!=在与“无”进行比较时使用“
添加回答
举报