可能重复:
“Least Astonishment” in Python: The Mutable Default Argument
我对Python函数/方法中可选参数的工作原理感到困惑。
我有以下代码块:
>>> def F(a, b=[]):
... b.append(a)
... return b
...
>>> F(0)
[0]
>>> F(1)
[0, 1]
>>>
为什么F(1)
会返回[0, 1]
而不是[1]
?
我的意思是,里面发生的事情?
答案 0 :(得分:43)
几年前来自PyCon的好文档 - Default parameter values explained。但基本上,由于列表是可变对象,并且在函数定义时评估关键字参数,因此每次调用该函数时,都会得到相同的默认值。
正确的方法是:
def F(a, b=None):
if b is None:
b = []
b.append(a)
return b
答案 1 :(得分:9)
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