这些测试中没有任何测试。
if val != None:
if not (val is None):
if val is not None:
哪一个更可取,为什么?
if val is not None:
# ...
是 Python 惯用语,用于测试变量是否未设置为
None
。这个习惯用法在使用默认参数声明关键字函数的情况下有特殊用途。 is
在 Python 中测试身份。由于正在运行的 Python 脚本/程序中存在且仅有一个 None
实例,因此 is
是对此的最佳测试。正如 Johnsyweb 指出的那样,这在 PEP 8 的“编程建议”下进行了讨论。
至于为什么首选这个
if not (val is None):
# ...
来自,编程建议,PEP 8:
与像 None 这样的单例的比较应该总是使用
或is
来完成,而不是使用相等运算符。is not
此外,当你真正的意思是
时,请小心书写if x
— 例如当测试默认为 None 的变量或参数是否设置为其他值时。另一个值可能具有在布尔上下文中可能为 false 的类型(例如容器)!if x is not None
PEP 8 是任何 Python 程序员的必备读物。
解决这些类型的问题的最佳选择是看看 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
是一个坏主意。
后两者中的任何一个,因为
val
可能是定义 __eq__()
在传递 None
时返回 true 的类型。