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

Python:打印树的所有节点无意中存储数据,python,class,python-3.x,tree,Python,Class,Python 3.x,Tree,我通过创建一个节点对象,在python中创建了一个通用树。每个节点可以有0、1或2棵树 我试图创建一个方法来打印树中所有节点的列表。清单不必按顺序排列。以下是我过于简单的尝试: def allChildren(self, l = list()): l.append(self) for child in self.children: l = child.allChildren(l) return l 我第一次运行此方法时,它工作正常。但是,由于某些原因,它

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

我试图创建一个方法来打印树中所有节点的列表。清单不必按顺序排列。以下是我过于简单的尝试:

def allChildren(self, l = list()):
    l.append(self)
    for child in self.children:
        l = child.allChildren(l)
    return l
我第一次运行此方法时,它工作正常。但是,由于某些原因,它正在存储以前的运行。第二次运行该方法时,它会将所有节点打印两次。即使我创建了两个独立的树,它仍然记得以前的运行。例如:我创建了两棵树,a和b。如果运行a.allChildren(),则会收到正确的结果。然后我运行b.allChildren()并接收a的所有节点和b的所有节点。

尝试以下操作:

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

    l.append(self)
    for child in self.children:
        l = child.allChildren(l)
    return l
并查看解释。

尝试以下方法:

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

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

查看解释。

您有一个可变值作为函数参数的默认值
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

这一现象在中解释得更为透彻。

您有一个可变值作为函数参数
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

这一现象在中解释得更为透彻。

如果您正在编写默认参数,如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

如果您正在编写默认参数,如l=list(),它将在编译函数时创建list,因此它将为所有函数调用创建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