我正在使用一些重新定义类的相等性(通过 __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 而言,其中“相等”实际上意味着“既不大于也不小于”)。

10-07 13:09