首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在比较值之前,使用`==`比较是否比较身份?

在比较值之前,使用`==`比较是否比较身份?
EN

Stack Overflow用户
提问于 2015-10-08 09:13:41
回答 2查看 136关注 0票数 3

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

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

代码语言:javascript
复制
>>> a = 'a sequence of chars'
>>> b = a

这是比较值,还是仅仅比较ids?:

代码语言:javascript
复制
>>> b == a
True

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

x==y调用x.__eq__(y)

这并不能告诉我在调用x.__eq__(y)之前是否做了任何事情。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-08 09:34:23

对于用户定义的类实例,is用作回退--在默认__eq__不被覆盖的情况下,a == b被计算为a is b。这确保了比较总是有结果(除非在NotImplemented情况下,在这种情况下,比较是明确禁止的)。

这是(有点倾斜的好点斯文·马纳赫)在数据模型文档 (重点雷)中提到的:

默认情况下,用户定义的类具有__eq__()__hash__()方法;使用它们,所有对象都比较不平等(除了它们本身)x.__hash__()返回一个适当的值,使得x == y同时包含x is yhash(x) == hash(y)

您可以如下所示:

代码语言:javascript
复制
>>> class Unequal(object):
    def __eq__(self, other):
        return False


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

因此,__eq__必须在id之前被调用,但是:

代码语言:javascript
复制
>>> class NoEqual(object):
    pass

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

因此,必须在未定义id的情况下调用__eq__

您可以看到这个在CPython实现中,它注意到:

代码语言:javascript
复制
/* If neither object implements it, provide a sensible default
   for == and !=, but raise an exception for ordering. */

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

票数 6
EN

Stack Overflow用户

发布于 2015-10-08 09:54:19

除了@jonrsharpe的回答:如果要比较的对象实现了__eq__,那么Python首先检查标识是错误的。

请查看以下示例:

代码语言:javascript
复制
>>> x = float('nan')
>>> x is x 
True
>>> x == x
False

NaN是一个特定的东西,不应该与其本身相比较;但是,即使在这种情况下,x is x也应该返回True,因为is的语义是这样的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33011449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档