函数中的可选参数及其可更改的默认值[重复]

问题描述 投票:38回答:2

可能是重复的。 Python 中的 "Least Astonishment"。可互换的默认参数

我对Python函数方法中的可选参数是如何工作的有点困惑。

我有以下代码块。

>>> def F(a, b=[]):
...     b.append(a)
...     return b
...
>>> F(0)
[0]
>>> F(1)
[0, 1]
>>>

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

我是说.., 内情

python parameters parameter-passing optional-parameters
2个回答
45
投票

几年前PyCon的好文档------。默认参数值解释. 但基本上,由于列表是可变的对象,而关键字参数是在函数定义时评估的,所以每次调用函数时,你都会得到相同的默认值。

正确的做法应该是

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

9
投票

默认参数 很直观的说,有点像函数对象的成员变量。

默认参数值在函数定义执行时被评估。这意味着当函数被定义时,表达式会被评估一次,而且每次调用都会使用相同的 "预计算 "值。当缺省参数是一个可变化的对象(如列表或字典)时,这一点尤其重要:如果函数修改了对象(如在列表中追加一个项目),缺省值实际上就被修改了。

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
© www.soinside.com 2019 - 2024. All rights reserved.