我对Python函数方法中的可选参数是如何工作的有点困惑。
我有以下代码块。
>>> def F(a, b=[]):
... b.append(a)
... return b
...
>>> F(0)
[0]
>>> F(1)
[0, 1]
>>>
为什么 F(1)
返回 [0, 1]
而不是 [1]
?
我是说.., 内情
几年前PyCon的好文档------。默认参数值解释. 但基本上,由于列表是可变的对象,而关键字参数是在函数定义时评估的,所以每次调用函数时,你都会得到相同的默认值。
正确的做法应该是
def F(a, b=None):
if b is None:
b = []
b.append(a)
return b
默认参数 很直观的说,有点像函数对象的成员变量。
默认参数值在函数定义执行时被评估。这意味着当函数被定义时,表达式会被评估一次,而且每次调用都会使用相同的 "预计算 "值。当缺省参数是一个可变化的对象(如列表或字典)时,这一点尤其重要:如果函数修改了对象(如在列表中追加一个项目),缺省值实际上就被修改了。
http:/docs.python.orgreferencecompound_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