Python 3:获取列表的 __repr__ 时超出最大递归深度

cap*_*pjo 4 python

我需要一个 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)

met*_*ter 5

你的默认参数中有一个可变对象

    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)

两者都分配一个新的列表实例,这将消除这个问题。