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

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

我对可选参数如何在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.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
链接地址: http://www.djcxy.com/p/28519.html

上一篇: Optional parameters in Python functions and their default values

下一篇: Why is the empty dictionary a dangerous default value in Python?