2012-07-13 39 views
2

我創建一個雙向鏈表結構,因與兩個節點是否相等比較的一些問題。該結構相當複雜,它具有多個屬性,包括名稱,行,列,右,左,上和下。如果兩個節點相等,他們必須同意所有這些屬性。我知道在我EQ方法我可以簡單地硬編碼檢查每個屬性與其他的,但我覺得那裏會做一個更簡單的方法,發現工作的大部分時間的一種方式。因此,我有以下幾點:確定兩個字典相等的Python錯誤

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,但除了這兩項解決方案,其他的東西,將不勝感激,

+0

做一些調試:在'__eq__'方法的'return'之前使用'print vars(self)','print vars(other)'。或者你可以直接去'import pdb; 'return'語句之前的pdb.set_trace()'。 – 2012-07-13 18:09:54

回答

2

它看起來像你的上,下等是指向你的類的其他實例。

你比較代碼基本上是說,以測試自己==等,確實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 
+0

是的,這正是我所說的非常感謝你。我會用這個! – slippery44 2012-07-13 18:15:23

1

我手頭沒有Python,但我想這是發生了什麼:

self__dict__

,並在other__dict__是areference到您的節點之一 現在比較此節點是否相等(一次是來自變量的變量,一次來自變量),這會導致您的比較方法被調用。

如果你現在有一個循環(即摹共同的父),你得到無限遞歸:

在原來的比較: 比較self.parentother.parent

在父母比較: 比較self.parent.childother.parent.child

parentchild請參閱您的updown) (未測試):

def __eq__(self, other): 
    for s, o in zip(vars(self),vars(other)): 
     if not s is o and s != o: 
      return False 

    return True 

基本上Hugh Bothwell建議的,只是在一個循環。首先檢查你是否在內存中有相同的對象,如果是的話不要比較它們,否則測試。

+0

你顯然是對的。也許是'down','up'等等。是相同類型的項目。 – 2012-07-13 18:11:51

+0

啊是的!這絕對是我的錯誤。謝謝! – slippery44 2012-07-13 18:14:50

+0

@ThomasOrozco對於您的編輯,我很抱歉,我在編輯的同時,該帖子被社區拒絕,是否有方法將您的編輯合併回來? – ted 2012-07-13 18:22:22