我正在使用一些重新定义类的相等性(通过 __cmp__
方法)的现有代码。它没有按预期工作,在尝试修复它时,我遇到了一些我不理解的行为。如果您在仅调用内置函数 __cmp__
的类上定义 cmp
,那么我希望它始终达到最大递归深度。但是,如果您尝试将类的实例与其自身进行比较,它将返回 0。
这是代码:
class A:
def __cmp__(self, other):
return cmp(self, other)
a = A()
b = A()
cmp(a, a) # returns 0
cmp(b, b) # returns 0
cmp(a, b) # results in RuntimeError: maximum recursion depth exceeded
RuntimeError 我理解,但我不明白为什么前两次调用
cmp
会成功。我已经通读了 python 文档的 data model 部分和其他类似 python equality 很好分解的内容,但找不到这个递归的答案。
而且,是的,我明白,正如所写的那样,这是一个毫无意义的类(class)。我正在使用的代码试图在某些情况下重新定义相等性,否则就会陷入基本情况。基本情况无法按实现方式工作,因此我正在尝试修复它。我认为调用
cmp
可能会起作用并发现了这个问题。我希望理解这一点将帮助我找到合适的解决方案。 最佳答案
当两个名称引用同一个对象时,它们根据定义是相等的( 编辑 :至少就 cmp
而言,其中“相等”实际上意味着“既不大于也不小于”)。