这些不是无测试.
if val != None:
if not (val is None):
if val is not None:
Run Code Online (Sandbox Code Playgroud)
哪个更好,为什么?
got*_*nes 918
if val is not None:
# ...
Run Code Online (Sandbox Code Playgroud)
是用于测试变量未设置的Pythonic习语None
.在使用默认参数声明关键字函数的情况下,此惯用法具有特殊用途.is
在Python中测试身份.因为None
在运行的Python脚本/程序中只存在一个且只有一个实例,所以这是is
最佳测试.正如Johnsyweb指出的那样,这将在PEP 8的 "编程建议"中进行讨论.
至于为什么这是优选的
if not (val is None):
# ...
Run Code Online (Sandbox Code Playgroud)
这只是Python的禅宗的一部分:"可读性很重要." 好的Python通常接近良好的伪代码.
Ign*_*ams 22
后两者中的任何一个,因为val
可能是一个定义__eq__()
为在传递时返回true 的类型None
.
She*_*tJS 20
这些类型问题的最佳选择是确切了解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
Run Code Online (Sandbox Code Playgroud)
请注意,最后两种情况会减少到相同的操作序列(python读取not (val is None)
并使用is not
运算符).第一个使用!=
运算符与None进行比较.
正如其他答案所指出的那样,!=
在与None比较时使用是一个坏主意
归档时间: |
|
查看次数: |
711282 次 |
最近记录: |