2011-05-09 62 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