首选这样做:
if x is y:
return True
或
if x == y
return True
“不是”也是一样
x is y
与 x == y
不同。
当且仅当 x is y
时,
id(x) == id(y)
为真——也就是说,x
和 y
必须是同一个对象(具有相同的 id
)。
对于所有内置的 Python 对象(如字符串、列表、字典、函数等),如果
x is y
,则 x == y
也为 True。然而,这通常并不能得到保证。严格来说,当且仅当 x == y
返回 True 时,x.__eq__(y)
才为 true。
可以使用始终返回 False 的
x
方法来定义对象 __eq__
,例如,这将导致 x == y
返回 False,即使 x is y
.
所以底线是,
x is y
和x == y
是完全不同的测试。
考虑这个例子:
In [1]: 0 is False
Out[1]: False
In [2]: 0 == False
Out[2]: True
PS。而不是
if x is y:
return True
else:
return False
写起来更Pythonic
return x is y
同样,
if x == y:
return True
else:
return False
可以替换为
return x == y
x is y
比较两个对象的身份,并询问'同一个对象的x
和y
是否有不同的名称?'相当于id(x) == id(y)
。
x == y
使用相等运算符并提出更宽松的问题 ' x
和 y
相等吗?' 对于用户定义类型,它相当于 x.__eq__(y)
。
__eq__
特殊方法应该表示对象的“相等”,例如表示分数的类希望 1/2 等于 2/4,即使“一半”对象不能具有与“两季度”对象。
请注意,不仅
a == b
并不意味着 a is b
,反之亦然。一般来说,其中一个要求并不比另一个更严格。是的,这意味着如果您确实愿意,您可以让 a == a
返回 False
,例如:
>>> a = float('nan')
>>> a is a
True
>>> a == a
False
实际上,
is
是几乎总是比==
更具体的比较。
==
和 !=
是对象 值 比较运算符is
和 is not
是对象 identity 比较运算符正如其他人已经说过的,
is
(和is not
)仅当您实际上关心一对变量引用完全相同的对象时。在大多数情况下,你真的根本不在乎,所以你会使用 ==
和 !=
。
但是,如果您查看大量 Python 代码,您可能会开始注意到,在与 is
、
is not
进行比较时,更有可能使用 True
(和 False
)和
None
。造成这种情况的主要原因是这些对象是单例,这意味着每个值都有一个实例。为什么这很重要?好吧,这导致了另一个原因......速度。
对于
==
和 !=
,解释器必须拉起两个引用的对象才能进行比较(它们是否相同),而 is
和 is not
只需检查它们所引用的对象的值即可。话虽如此,您可以看到后一对执行速度更快,因为您不必获取对象本身来进行比较。这是几年前的一次速度测试,我们得出的结论是,对于一次性来说,这没什么大不了的,但如果在紧密循环中调用无数次,那么,它就会开始累加。
http://mail.python.org/pipermail/tutor/2008-June/062708.html
底线是,您可以使用对象身份比较来检查
True
、False
和 None
,而其他所有内容都应该使用直接的相等运算符。我们不会在这里讨论实习整数或绑定实例方法或类似的内容。 :-)
视情况而定。
is
和is not
进行身份比较,这有利于None
、Ellipsis
,或者确保两个对象相同。否则,请使用 ==
或 !=
。