参见英文答案 > What is the difference between “ is None ” and “ ==None ” 4个
> Why does comparing strings using either ‘==’ or ‘is’ sometimes produce a different result? 15个
如果我写这个:
if x == None:
x = 1
我的pyCharm编辑器一直建议我应该使用’is’而不是’==’:
if x is None:
x = 1
对于任何其他相等检查,pyCharm不建议使用’is’,如:
if x == 2:
x = 1
为什么’is’运算符优先于’==’运算符,同时检查对象是否为None?
为什么它仅适用于None?
解决方法:
因为None是单例,所以Python程序中只有一个对象副本.
测试单个对象时速度更快,因为只有指针需要相等. ==测试更多信息,在这种情况下,测试对象的状态也需要相同.
如果您的x对象实现自定义object.__eq__()
method,这变得更加明显;每次使用x == None时都会调用它,而x为None则没有这样的钩子.这意味着每次进行相等性测试时,解释器必须执行更多Python代码.我是否已经提到过一个简单的指针相等测试(用于is)很快?
该钩子还使自定义类型可以声明自己等于None:
class Devious(object):
def __eq__(self, other):
return other is None
现在你的x == None测试将是真的,即使x实际上不是None,而是一个Devious的实例.如果你真的想知道x是否设置为None,只有x是None才能检测到这种情况.
None不是您可以测试身份的唯一对象.每当您需要知道给定名称是否引用特定对象而不是值时,您应该使用is.
例如,有时您需要允许None为有效值,但您想要检测是否未指定任何值.通常你可以使用None作为哨兵来检测是否遗漏了一个参数:
def foo(arg1, optional=None):
if optional is None:
# no value given for optional
但如果你想将None作为有效值,你会使用不同的哨兵:
_sentinel = object()
def foo(arg1, optional=_sentinel):
if optional is _sentinel:
# no value given for optional
现在你可以使用foo(1,None),它将被正确地视为一个值.