1

通过创建 Node 对象,我在 python 中创建了一个通用树。每个节点可以有 0、1 或 2 棵树。

我正在尝试创建一种方法来打印树中所有节点的列表。该列表不必按顺序排列。这是我的简单尝试:

def allChildren(self, l = list()):
    l.append(self)
    for child in self.children:
        l = child.allChildren(l)
    return l

我第一次运行此方法时,它可以正常工作。但是,由于某种原因,它正在存储以前的运行。我第二次运行该方法时,它会将所有节点打印两次。即使我创建了 2 个单独的树,它仍然会记住以前的运行。例如:我创建了 2 棵树,a 和 b。如果我运行 a.allChildren() 我会收到正确的结果。然后我运行 b.allChildren() 并接收所有 a 的节点和所有 b 的节点。

4

3 回答 3

5

您有一个可变值作为函数参数的默认值l。在 Python 中,这意味着当您调用 时l.append(self),您将永久修改默认参数。

为了避免这个问题,l每次调用函数都设置一个新的列表,如果没有传入列表:

def allChildren(self, l = None):
    if l is None:
        l = list()
    l.append(self)
    for child in self.children:
        l = child.allChildren(l)
    return l

这个现象在这个问题中得到了更彻底的解释。

于 2013-07-29T18:03:09.440 回答
3

尝试这个:

def allChildren(self, l = None):
    if(l==None):
        l = list()

    l.append(self)
    for child in self.children:
        l = child.allChildren(l)
    return l

并查看这个答案以获得解释。

于 2013-07-29T18:01:50.100 回答
2

如果您正在编写像 l = list() 这样的默认参数,它将在编译函数时创建列表,因此它将为所有函数调用创建一个列表实例。为防止这种情况,请使用 None 并在函数内创建新列表:

def allChildren(self, l = None):
    if not l: l = []
    l.append(self)
    for child in self.children:
        l = child.allChildren(l)
    return l
于 2013-07-29T18:06:48.397 回答