2011-05-09 81 views
0

可能重複:
「Least Astonishment」 in Python: The Mutable Default ArgumentPython 2.7中的錯誤或誤解?

我失去了一些東西在這裏還是這真的是一個錯誤?例如,下面是一個遞歸函數,它根據元組規範生成多維列表。

dim((2,3)) 
returns 
[[[],[],[]],[[],[],[]]] 

唯一的問題是,它每一次我稱呼它,如果我把它叫做沒有默認參數,如果我指定喜歡昏暗的默認參數添加到列表((2,3),[]) ,那很好。它保存每次調用的默認參數的狀態!如果沒有人能找到我在做什麼的問題,我會將它輸入到python bug記者。

cdr = lambda l : l[1:] 
car = lambda l : l[0] 
last = lambda x : x[-1:][0] 


def dim(t, c = []): 
    if len(t) > 0: 
     i = car(t) 
     for j in range(i): 
      c.append([]) 
      dim(cdr(t), last(c)) 
    return c 


print dim([2,3]) 
print dim([2,3]) 
print dim([2,3]) 
print dim([2,3]) 

回答

0

def dim(t, c = [])

這是(在你的代碼)的錯誤。 c = []部分僅在整個程序中評估一次。當你調暗,c正在不斷追加到。更好的方法是:

def dim(t, c=None): 
    if c is None: 
     c = [] 
    ... 
+0

沒問題。但是對於挑選,'is'是用於與單身人士比較(最顯着的,當然是「無」)的優選方式 - 即's/if c == None/if c is None /'。 – delnan 2011-05-09 15:29:13