2011-06-22 60 views

回答

38

来自PyCon几年前的好文档 - Default parameter values explained。但基本上,因为列表是可变对象,并且在函数定义时计算关键字参数,所以每次调用该函数时,都会得到相同的默认值。

要做到这一点是正确的做法:

def F(a, b=None): 
    if b is None: 
     b = [] 
    b.append(a) 
    return b 
8

Default parameters是,相当直观,有点像函数对象的成员变量。

当函数定义被执行时,评估默认参数值。这意味着表达式被定义一次,定义函数时,并且每次调用都使用相同的“预先计算”值。这对于了解默认参数是否为可变对象(如列表或字典)时尤为重要:如果函数修改对象(例如,通过将项目附加到列表中),则实际上会修改默认值。

http://docs.python.org/reference/compound_stmts.html#function

列表是一个可变的物体;你可以改变他们的内容。得到默认列表(或字典,或设置)正确的方法是在运行时创建它来代替,里面的功能:

def good_append(new_item, a_list=None): 
    if a_list is None: 
     a_list = [] 
    a_list.append(new_item) 
    return a_list