2015-10-15 97 views
1

我需要Python中的樹數據結構從網站複製它,並遇到一些非常奇怪的問題。Python 3:獲取列表__repr__時超出最大遞歸深度

如果你創建了有兩個arguements它的工作對象,如果你只使用一個自變量,它在打印失敗,

RecursionError: maximum recursion depth exceeded while getting the repr of a list

我理解錯誤,但目前尚不清楚在哪裏以及爲什麼會發生。代碼也應該使用默認參數工作。我知道這是可變的。

class node(object): 
    def __init__(self, value, children = []): 
     self.value = value 
     self.children = children 

    def __repr__(self, level=0): 
     ret = "\t"*level+repr(self.value)+"\n" 
     for child in self.children: 
      ret += child.__repr__(level+1) 
     return ret 

    def add(self, value): 
     self.children.append(node(value)) 

#tree = node([1,4,3], [node([2,5,3])]) <-- works 
tree = node([1,4,3]) # <-- fails 
tree.add([3,4,3]) 
tree.add([4,4,3]) 

print(tree) 
+1

嘗試將'self.children = children'更改爲'self.children = children [:]' – thefourtheye

回答

3

你在你的默認參數

def __init__(self, value, children = []): 

這導致children一個列表實例,所以當你建造第二個列表,然後你的孩子的名單將被添加到默認有一個可變對象列表迭代將遍歷該列表中,導致這個無限循環。

你應該做這樣的事情

def __init__(self, value, children=None): 
     self.value = value 
     if children is None: 
      children = [] 
     self.children = children 

或者你可以

 self.children = children or [] 

兩個分配一個新的列表實例,這將可以解決這一問題。

+0

謝謝! 經過一段時間的思考,我明白了! 我不應該從網站上覆制錯誤的代碼... – capjo

相關問題