2015-10-15 91 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

相关问题