You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python中d1==d2与d1.__eq__(d2)结果不一致?

为什么Python中==和直接调用__eq__()返回结果不同?

根据Python 3.8文档:

默认情况下,object使用is实现__eq__(),比较为假时返回NotImplemented:True if x is y else NotImplemented。

运算符符号与方法名的对应关系如下:[...] x==y调用x.__eq__(y)

基于以上描述,我原本预期:

  • ==与__eq__()等价;
  • 未显式定义__eq__的自定义类,使用==比较不同实例时返回NotImplemented。

但实际测试结果却和预期不符:

class Dummy():
    def __init__(self, a):
        self.a = a

d1 = Dummy(3)
d2 = Dummy(3)

d1 == d2 # 返回 False
d1.__eq__(d2) # 返回 NotImplemented

这是为什么?


解答

这是因为Python的运算符调度逻辑在处理==时,会对__eq__()的返回值做额外的后续处理:

  • 当x.__eq__(y)返回NotImplemented时,Python会尝试调用y.__eq__(x);
  • 如果y.__eq__(x)同样返回NotImplemented,Python会最终退回到对象身份比较,返回x is y的结果。

在你的测试场景中:

  1. 调用d1.__eq__(d2)返回NotImplemented;
  2. Python接着尝试调用d2.__eq__(d1),同样返回NotImplemented;
  3. 最后执行身份判断d1 is d2,结果为False,因此d1 == d2最终返回False。

而直接调用__eq__()方法时,不会触发这些后续的回退逻辑,所以得到的就是方法本身的返回值NotImplemented。

内容的提问来源于stack exchange,提问作者the.real.gruycho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 20:55:15