为何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的结果。
在你的测试场景中:
- 调用
d1.__eq__(d2)返回NotImplemented; - Python接着尝试调用
d2.__eq__(d1),同样返回NotImplemented; - 最后执行身份判断
d1 is d2,结果为False,因此d1 == d2最终返回False。
而直接调用__eq__()方法时,不会触发这些后续的回退逻辑,所以得到的就是方法本身的返回值NotImplemented。
内容的提问来源于stack exchange,提问作者the.real.gruycho
相关产品推荐
相关产品推荐

