在比较值之前比较使用`==`比较身份?

时间:2015-10-08 09:13:42

标签: python identity equality-operator

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

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

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

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

>>> b == a
True

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

  

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

在调用x.__eq__(y)之前没有告诉我是否做了任何事情。

2 个答案:

答案 0 :(得分:6)

对于用户定义的类实例,is用作后备 - 默认__eq__未被覆盖,a == b被评估为a is b。这样可以确保比较始终具有结果(NotImplemented情况除外,明确禁止比较)。

这是Sven Marnach(强调我的)中提到的(有点倾斜 - 好地点data model documentation):

  

用户定义的类具有__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

所以必须在__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. */

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

答案 1 :(得分:3)

除了@jonrsharpe的答案:如果被比较的对象实现__eq__,那么Python首先检查身份将是错误的

请看以下示例:

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

NaN是一个不应该与自身相等的特定事物;但是,即使在这种情况下x is x也应该返回True,因为is的语义。