2013-03-08 72 views
-2

所以我有一個幫助函數應該打印出二進制樹(未排序)的內部節點和葉子。我將不提供代碼,因爲我在一個類中來,但是我可以告訴你,我已經編寫它和它的作品爲第一個節點我扔在那裏:python遞歸函數沒有初始化默認參數值

def helper(root, internals=[], leaves=[]): 
    #function code here... 
>>> helper(node) 
    ([13, 14, 27], [10, 11, 12, 17, 19]) 

這是正確的輸出, 我所知道的。然而,當我再次調用同一個函數上另一節點,輸出到覆蓋前一個:

>>> helper(pen) 
    ([13, 14, 27, 6, 8, 14], [10, 11, 12, 17, 19, 2, 4, 10, 12]) 

這是不正確的,因爲樹pen不具備的要素13,14,27或10,11,12,17,19。有人可以解釋這裏發生了什麼嗎?我不得不爲每次重啓shell而測試不同情況下的功能。我該如何解決?

+0

「我將不提供代碼,因爲我在一類是......」 - 什麼你所做的是國際海事組織是一個更好的做法。函數本身的細節與您的問題完全無關,所以最好不要將它們拋出。 – millimoose 2013-03-08 00:28:15

回答

0

當遇到函數定義時,評估默認參數,也就是說,當Python看到def行時。然後它們綁定到函數本身。

使用可變默認參數時,綁定到該函數的默認參數可能會更改,這會導致一些令人驚訝的結果。

通常的建議是:使用None爲默認值,並根據需要創建實際的默認值:

def foo(bar=None): 
    if bar is None: 
     bar = [] 
    ... 
+0

這不起作用,因爲我的函數是遞歸的。每次函數被再次調用時,'bar'被賦予'None',並且第一個'if'語句總是被執行,所以我最終會得到一個空列表或者一個帶有1個元素的列表。 – noobProgrammer 2013-03-08 00:43:32

+0

然後你需要明確地傳入當前的條,即'foo(bar)'。 – nneonneo 2013-03-08 00:44:21

+0

你的意思是我遞歸地調用函數時應該明確地傳入參數?該死的權利。我會試試看。我愚蠢。 – noobProgrammer 2013-03-08 00:46:54