3

如果我使用 比较两个变量==,Python 是否比较身份,如果它们不相同,那么比较值?

例如,我有两个指向同一个字符串对象的字符串:

>>> a = 'a sequence of chars'
>>> b = a

这是比较值还是只比较 id?:

>>> b == a
True

首先比较身份是有意义的,我猜是这样,但我还没有在文档中找到任何支持这一点的东西。我得到的最接近的

x==y来电x.__eq__(y)

这并没有告诉我在调用x.__eq__(y).

4

2 回答 2

6

对于用户定义的类实例,is用作备用 - 其中默认__eq__值未被覆盖,a == b被评估为a is b. 这确保了比较总是有结果(除非NotImplemented明确禁止比较)。

这是数据模型文档(强调我的)中提到的(有点倾斜 - 好点Sven Marnach ):

用户定义的类默认有__eq__()__hash__()方法;与它们相比,所有对象都比较不相等(除了它们自己)x.__hash__()返回一个适当的值,这样就x == y意味着x is yhash(x) == hash(y)


您可以按如下方式进行演示:

>>> class Unequal(object):
    def __eq__(self, other):
        return False


>>> ue = Unequal()
>>> ue is ue
True
>>> ue == ue
False

so__eq__必须在 之前调用id,但是:

>>> class NoEqual(object):
    pass

>>> ne = NoEqual()
>>> ne is ne
True
>>> ne == ne
True

所以id必须在__eq__未定义的地方调用。


您可以在 CPython implementation中看到这一点,其中指出:

/* If neither object implements it, provide a sensible default
   for == and !=, but raise an exception for ordering. */

实现的“合理默认值”v是指针和的 C 级相等比较w,它将返回它们是否指向同一个对象。

于 2015-10-08T09:34:23.983 回答
3

除了@jonrsharpe 的回答:如果被比较的对象实现了,Python 首先检查身份__eq__错误的。

看下面的例子:

>>> x = float('nan')
>>> x is x 
True
>>> x == x
False

NaN 是一个特定的东西,永远不应该与它自己比较;然而,即使在这种情况下x is x也应该返回True,因为is.

于 2015-10-08T09:54:19.953 回答