如果我使用==
比较两个变量,Python是否会比较身份,如果它们不相同,那么比较这些值?
例如,我有两个指向同一个字符串对象的字符串:
>>> a = 'a sequence of chars'
>>> b = a
这是比较值还是只比较ids?:
>>> b == a
True
首先比较身份是有意义的,我猜是这样的,但我还没有在文档中找到任何支持这一点的内容。我最接近的是this:
x==y
来电x.__eq__(y)
在调用x.__eq__(y)
之前没有告诉我是否做了任何事情。
答案 0 :(得分:6)
对于用户定义的类实例,is
用作后备 - 默认__eq__
未被覆盖,a == b
被评估为a is b
。这样可以确保比较始终具有结果(NotImplemented
情况除外,明确禁止比较)。
这是Sven Marnach(强调我的)中提到的(有点倾斜 - 好地点data model documentation):
用户定义的类具有
__eq__()
和__hash__()
方法 默认;与他们,所有对象比较不等(除了 他们自己)和x.__hash__()
返回一个合适的值x == y
同时暗示x is y
和hash(x) == hash(y)
。
您可以按如下方式演示:
>>> class Unequal(object):
def __eq__(self, other):
return False
>>> ue = Unequal()
>>> ue is ue
True
>>> ue == ue
False
所以必须在__eq__
之前调用id
,但是:
>>> class NoEqual(object):
pass
>>> ne = NoEqual()
>>> ne is ne
True
>>> ne == ne
True
所以必须在未定义id
的情况下调用__eq__
。
您可以看到此in the CPython implementation,其中注明:
/* If neither object implements it, provide a sensible default
for == and !=, but raise an exception for ordering. */
实现的“合理默认值”是指针v
和w
的C级相等比较,它们将返回它们是否指向同一个对象
答案 1 :(得分:3)
除了@jonrsharpe的答案:如果被比较的对象实现__eq__
,那么Python首先检查身份将是错误的。
请看以下示例:
>>> x = float('nan')
>>> x is x
True
>>> x == x
False
NaN是一个不应该与自身相等的特定事物;但是,即使在这种情况下x is x
也应该返回True
,因为is
的语义。