函数中的可选参数及其可变默认值

47

可能是重复问题:
“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]

我的意思是,内部发生了什么


你可以很容易地通过在将b添加到列表之前打印其值来看到它。 :) - sam
2个回答

51

几年前 PyCon 上有一篇很好的文档 - 解释默认参数值。基本上,由于列表是可变对象,而关键字参数在函数定义时被评估,因此每次调用函数时,您都会得到相同的默认值。

正确的方法是:

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

10

默认参数有点像函数对象上的成员变量。

默认参数值在函数定义时进行计算。这意味着表达式仅在函数定义时计算一次,并且相同的“预计算”值将用于每次调用。当默认参数是可变对象(例如列表或字典)时,这一点尤为重要:如果函数修改了对象(例如通过向列表添加项目),则默认值实际上也被修改了。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接