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

Osc*_*ros 36 python parameters parameter-passing optional-parameters

可能重复:
Python中的"最小惊讶":可变默认参数

我对Python函数/方法中可选参数的工作原理感到困惑.

我有以下代码块:

>>> def F(a, b=[]):
...     b.append(a)
...     return b
...
>>> F(0)
[0]
>>> F(1)
[0, 1]
>>>
Run Code Online (Sandbox Code Playgroud)

为什么F(1)回归[0, 1]而不是[1]

我的意思是,里面发生了什么

Ben*_*den 43

几年前来自PyCon的好文档 - 解释了默认参数值.但基本上,由于列表是可变对象,并且在函数定义时计算关键字参数,因此每次调用该函数时,都会得到相同的默认值.

正确的方法是:

def F(a, b=None):
    if b is None:
        b = []
    b.append(a)
    return b
Run Code Online (Sandbox Code Playgroud)


Jon*_*röm 9

直观地说,默认参数有点像函数对象上的成员变量.

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

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
Run Code Online (Sandbox Code Playgroud)