如果我使用==比较两个变量,是否比较标识,如果它们不相同,那么比较值吗?
例如,我有两个字符串指向同一个string对象:
>>> a = 'a sequence of chars'
>>> b = a这是比较值,还是仅仅比较ids?:
>>> b == a
True首先比较身份是有意义的,我想是这样的,但我还没有在文档中找到任何支持这一点的东西。离我最近的是这
x==y调用x.__eq__(y)
这并不能告诉我在调用x.__eq__(y)之前是否做了任何事情。
发布于 2015-10-08 09:34:23
对于用户定义的类实例,is用作回退--在默认__eq__不被覆盖的情况下,a == b被计算为a is b。这确保了比较总是有结果(除非在NotImplemented情况下,在这种情况下,比较是明确禁止的)。
这是(有点倾斜的好点斯文·马纳赫)在数据模型文档 (重点雷)中提到的:
默认情况下,用户定义的类具有
__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__。
您可以看到这个在CPython实现中,它注意到:
/* If neither object implements it, provide a sensible default
for == and !=, but raise an exception for ordering. */实现的“合理默认”是指针v和w的C级相等比较,无论它们是否指向同一个对象都会返回。
发布于 2015-10-08 09:54:19
除了@jonrsharpe的回答:如果要比较的对象实现了__eq__,那么Python首先检查标识是错误的。
请查看以下示例:
>>> x = float('nan')
>>> x is x
True
>>> x == x
FalseNaN是一个特定的东西,不应该与其本身相比较;但是,即使在这种情况下,x is x也应该返回True,因为is的语义是这样的。
https://stackoverflow.com/questions/33011449
复制相似问题