题
这个问题在这里已经有一个答案:
在这些不是没有测试中。
if val != None:
if not (val is None):
if val is not None:
哪一个是可取的,为什么?
解决方案
if val is not None:
# ...
是用于测试的Pythonic SiviOM,认为变量未设置为 None
. 。这个成语在 用默认参数声明关键字函数. is
在Python中测试身份。因为只有一个和一个实例 None
在运行的Python脚本/程序中存在, is
是对此的最佳测试。作为 Johnsyweb指出, ,这是在 PEP 8 在“编程建议”下。
至于为什么优先
if not (val is None):
# ...
其他提示
从编程建议, PEP 8:
与像单人一样的比较,不应始终使用“ IS”或“不是”,而不是平等操作员。
另外,请注意写入“如果x”时,当您真正含义“如果x不是一个”时 - 例如测试默认为none的变量或参数时,将其设置为其他值。另一个值可能具有在布尔上下文中可能是错误的类型(例如容器)!
PEP 8对于任何Python程序员来说都是必不可少的阅读。
后两者中的任何一个,因为 val
可能是定义的类型 __eq__()
通过时返回true None
.
这些类型的问题最好的选择是确切查看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
操作员)。第一个使用 !=
操作员与无。
正如其他答案所指出的,使用 !=
当与众不同时是个坏主意
不隶属于 StackOverflow