2013-07-29 52 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