确定两个字典是否相等Python错误

时间:2012-07-13 18:01:48

标签: python runtime-error equals dictionary

我正在创建一个双重链接的结构,并且在比较两个节点是否相等时遇到了一些问题。该结构相当复杂,因为它具有多个属性,包括名称,行,列,右,左,上和下。如果两个节点相等,则必须就所有这些属性达成一致。我知道在我的 eq 方法中,我可以简单地硬编码检查每个属性与另一个属性,但我认为有一种更简单的方法来做到这一点,并找到了一种大部分时间都可以工作的方法。因此,我有以下内容:

def __init__ (self,row,col,name=None,up=None,down=None,left=None,right=None):
    self.name  = name
    self.row   = row
    self.col   = col
    self.up    = up
    self.down  = down
    self.left  = left
    self.right = right

def __eq__ (self, other):
    return vars(self) == vars(other)

以及其他各种对此并不重要的方法。因此,我确定两个节点是否基本上是查看变量字典的快捷方式,让python比较两个字典的等价性。

这很棒!只要两个节点实际上是相等的。它返回True,我用我的代码继续我的快乐方式。但是如果两个节点实际上不相等则会崩溃。我得到了

File "*filename*", line 35 in __eq__ return vars(self) == vars(self) 

在屏幕上写了很多次,直到最后说

RuntimeError: maximum recursion depth exceeded

我知道有一些解决方法,即我可以明确检查每个属性,但这是蹩脚的,我想知道为什么这不起作用,如果它可以很容易修复。我已经用其他更简单的词典测试了这个方法,它起作用,所以我的想法是这个问题与确定对象是否相等有关,但我不知道我能在这做什么。我意识到我也可以只是做一个错误捕获然后使返回False,但除了这两个解决方案之外的其他东西将不胜感激,

2 个答案:

答案 0 :(得分:2)

看起来你的向上,向下等指向你班级的其他实例。

你的比较代码基本上是说,测试self == other,self.up == other.up? self.up.up == other.up.up?然后再递归,直到它用完了空间。

您可能想要使用

def __eq__(self, other):
    return self.name == other.name \
        and self.row == other.row \
        and self.col == other.col \
        and self.up is other.up \
        and self.down is other.down \
        and self.left is other.left \
        and self.right is other.right

答案 1 :(得分:1)

我手头没有python,但我想这就是:

__dict__的{​​{1}}和self的{​​{1}}中的

是对您的某个节点的推断 现在对这个节点进行相等性比较(一次是vars,一次是另一个),这会导致你的比较方法被调用。

如果您现在有一个循环(例如普通父级),您将获得无限递归:

原始比较: 将__dict__other

进行比较 父母比较中的

: 将self.parentother.parent

进行比较

self.parent.childother.parent.child代表您的parentchild

试(未测试):

up

基本上是Hugh Bothwell建议的,只是在循环中。首先检查内存中是否有相同的对象,如果是,则不要比较它们,否则测试。