Python:打印树的所有节点无意中存储数据

标签 python class python-3.x tree

我通过创建一个 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 的所有节点。

最佳答案

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

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

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

这种现象在 this question 中得到了更彻底的解释。 .

关于Python:打印树的所有节点无意中存储数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17930980/

相关文章:

python - 内存游戏,检测两个图像相同的问题

c++ - 在 C++ 中重载运算符时,为什么 T* 优于 bool?

python - python 删除字符串中的字符组合

python - `with` 中 `concurrent.futures` 的功能

python - 更改函数内的绘图样式表

python - 从 RDD 中的单词过滤 Spark 数据框中的行

python - 如何将有效数字的数量限制为*不超过* str.format() 或 f-strings?

c++ - 类成员初始化C++

c++ - 将 C++ 代码从结构迁移到类

python - 使用一个函数来获取函数或常规属性的属性