Python:打印树的所有节点无意中存储了d

2024-10-02 04:28:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

我第一次运行这个方法时,它是正确的。但是,由于某些原因,它正在存储以前的运行。第二次运行该方法时,它会打印所有节点两次。即使我创建了两个独立的树,它仍然记得以前的运行。E、 g:我创建了两个树,a和b。如果我运行a.allChildren(),我会得到正确的结果。然后我运行b.allChildren()并接收a的所有节点和b的所有节点。在


Tags: 对象方法inselfchild列表forreturn
3条回答

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

def allChildren(self, l = None):
    if not l: l = []
    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

请查看this answer进行解释。在

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

这一现象在this question中有更详细的解释。在

相关问题 更多 >

    热门问题