Python 2.7中的错误或误解?

时间:2011-05-09 15:23:22

标签: python

  

可能重复:
  “Least Astonishment” in Python: The Mutable Default Argument

我在这里遗漏了什么或这真的是一个错误吗?下面是一个递归函数,例如,从元组规范生成多维列表。

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

唯一的问题是,每当我调用它时它会添加到列表中,如果我调用它而没有默认参数,如果我指定默认参数如dim((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])

1 个答案:

答案 0 :(得分:0)

def dim(t, c = [])

这是一个错误(在您的代码中)。 c = []部分仅在整个计划期间评估一次。当您调用dim时,c将被连续追加。更好的方法是:

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