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

时间:2011-06-22 06:29:06

标签: python parameters parameter-passing optional-parameters

  

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

我的意思是,里面发生的事情

2 个答案:

答案 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