Python: 函数中的默认列表

Python: Default list in function

来自 Python3 中 Summerfield 的编程:

内容如下: 当给出默认值时,它们是在执行 def 语句时创建的,而不是在调用函数时创建的。 但我的问题是针对以下示例:

def append_if_even(x, lst =None):
    lst = [] if lst is None else lst
    if x % 2 ==0:
        lst.append(x)
    return lst

作为第一次执行的定义,lst指向None 但是函数调用后 append_if_even(2),

Shouldn't lst point to [2], since after lst.append(x) lst not point to None anymore? Why the next execution still make lst point to none?

这正是您使用 lst=Nonelst = [] if lst is None else lst 构造所阻止的。虽然函数的默认参数仅在编译时计算一次,但每次执行函数时都会计算函数内的代码。所以每次你执行函数而不给lst传递值时,它会以默认值None开始,然后立即被一个new替换为空执行第一行函数时列出。

如果您改为像这样定义函数:

def append_if_even(x, lst=None):
    if lst is None:
        lst = []
    if x % 2 == 0:
        lst.append(x)
    return lst

然后它就会像你描述的那样。 lst 的默认值将是每个 运行 函数的 same 列表(最初为空),并且将添加传递给函数的每个偶数到一个不断增长的列表。

有关详细信息,请参阅 "Least Astonishment" and the Mutable Default Argument