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