2011-05-09 9 views
0

可能性の重複:
“Least Astonishment” in Python: The Mutable Default ArgumentPython 2.7のバグや誤解?

私はここで何かをしないのですかこれは本当にバグですか?以下は、例えばタプル仕様から多次元リストを生成する再帰関数です。

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

唯一の問題は、([]、(2,3))私は、デフォルトのパラメータなしでそれを呼び出す場合、私は薄暗いのようなデフォルトのパラメータを指定した場合、それは、リストに私はそれを呼び出すたびに追加していることです、それはいいです。各呼び出しのデフォルトパラメータの状態を保存しています!私がやっていることで誰も問題が見つからない場合、私はpythonのバグ報告者にそれを入力します。

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

正確です。しかし、ニックピックには、シングルトン(最も顕著な、もちろん、 'None')との比較には' 'is ''が優先されます。' '/もしc == None/cがNone /'ならば。 – delnan