我需要一个 Python 中的树数据结构,从网站复制它并遇到了一些非常奇怪的问题。
如果你创建一个带有两个参数的对象,它可以工作,如果你只使用一个参数,它在打印时会失败
RecursionError:获取列表的 repr 时超出最大递归深度
我理解这个错误,但不清楚它发生在哪里以及为什么发生。该代码还应该使用默认参数来工作。我知道它是可变的。
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)
Run Code Online (Sandbox Code Playgroud)
你的默认参数中有一个可变对象
def __init__(self, value, children = []):
Run Code Online (Sandbox Code Playgroud)
这会产生 的单个列表实例children,因此当您构造第二个列表时,您的子列表将被添加到该默认列表中,因此每次迭代都会在该列表内遍历,从而导致无限循环。
你应该做这样的事情
def __init__(self, value, children=None):
self.value = value
if children is None:
children = []
self.children = children
Run Code Online (Sandbox Code Playgroud)
或者你也可以
self.children = children or []
Run Code Online (Sandbox Code Playgroud)
两者都分配一个新的列表实例,这将消除这个问题。