从这些非None测试中。
if val != None:
if not (val is None):
if val is not None:
哪一个更可取,为什么?
从这些非None测试中。
if val != None:
if not (val is None):
if val is not None:
哪一个更可取,为什么?
当前回答
回答这类问题最好的办法是看看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为None)并使用is not操作符。第一个在与None比较时使用!=操作符。
正如其他答案所指出的,在与None进行比较时使用!=是一个坏主意。
其他回答
摘自,编程建议,PEP 8:
与None这样的单例对象的比较总是应该使用is或is not,而不是相等操作符。 另外,注意当你真正的意思是如果x不是None时写if x——例如,当测试一个默认为None的变量或参数是否被设置为其他值时。另一个值的类型(比如容器)在布尔上下文中可能是假的!
PEP 8对于任何Python程序员来说都是必不可少的读物。
if val is not None:
# ...
是python习语,用于测试变量是否未设置为None。这种习惯用法在使用默认参数声明关键字函数的情况下有特殊用途。在Python中测试身份。因为在运行的Python脚本/程序中有且只有一个None实例,所以is是最佳测试。正如Johnsyweb指出的,这在PEP 8的“编程建议”一节中进行了讨论。
至于为什么这是首选
if not (val is None):
# ...
这只是Python的禅的一部分:“可读性很重要。”好的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为None)并使用is not操作符。第一个在与None比较时使用!=操作符。
正如其他答案所指出的,在与None进行比较时使用!=是一个坏主意。
后两者中的任何一个,因为val可能是一种类型,该类型将__eq__()定义为在传递None时返回true。