问题:Python None比较:我应该使用“ is”还是==?
比较时我的编辑会警告我my_var == None
,但使用时不会警告my_var is None
。
我在Python Shell中进行了测试,并确定两者都是有效的语法,但我的编辑器似乎在说这my_var is None
是首选。
是这样吗?如果是这样,为什么?
回答 0
摘要:
使用is
时要核对对象的身份(如检查,看看是否var
是None
)。使用==
时要检查的平等(例如是var
等于3
?)。
说明:
您可以在其中my_var == None
返回的自定义类True
例如:
class Negator(object):
def __eq__(self,other):
return not other
thing = Negator()
print thing == None #True
print thing is None #False
is
检查对象身份。只有1个对象None
,因此在执行操作时my_var is None
,您要检查它们是否实际上是同一对象(而不仅仅是等效对象)
换句话说,==
是检查等效性(定义在对象之间),而is
检查对象身份:
lst = [1,2,3]
lst == lst[:] # This is True since the lists are "equivalent"
lst is lst[:] # This is False since they're actually different objects
回答 1
is
通常,在将任意对象与单例对象进行比较时,通常首选,None
因为它更快且更可预测。is
总是按对象身份进行比较,而==
做什么取决于操作数的确切类型,甚至取决于它们的顺序。
PEP 8对此建议提供了支持,该声明明确指出 “对单例的比较(如None,应始终使用is
或is not
,绝不能使用相等运算符进行)”。
回答 2
PEP 8定义is
比较单例时最好使用运算符。