2013-07-29 49 views
1

我创建了一个蟒蛇一般的树,通过创建一个Node对象数据。每个节点可以有0,1或2个树。的Python:打印树的所有节点无意存储

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

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的所有节点。

回答

2

试试这个:

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的说明。

4

作为函数参数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解释更彻底。

2

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

def allChildren(self, l = None): 
    if not l: l = [] 
    l.append(self) 
    for child in self.children: 
     l = child.allChildren(l) 
    return l