Python:函数中的默认列表

wil*_*Liu 4 python-3.x default-arguments

来自 Summerfield 的 Python3 编程:

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

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

第一次执行时,lst 指向 None 但在函数调用append_if_even(2)之后,

  • lst 不应该指向 [2],因为在 lst.append(x) lst 之后 lst 不再指向 None 吗?

  • 为什么下一次执行仍然使lst指向none?

  • 这个函数调用append_if_even(2)内部到底发生了什么?

gli*_*dud 5

lst 不应该指向 [2],因为在 lst.append(x) 之后 lst 不再指向 None 吗?为什么下一次执行仍然使lst指向none?

这正是使用lst=None,lst = [] if lst is None else lst结构所防止的。虽然函数的默认参数仅在编译时计算一次,但每次执行函数时都会计算函数内的代码。因此,每次执行该函数而不传递 值时lst,它将以默认值 开始,然后在执行函数的第一行时立即被新的None空列表替换。

如果您要像这样定义函数:

def append_if_even(x, lst=[]):
    if x % 2 ==0:
        lst.append(x)
    return lst
Run Code Online (Sandbox Code Playgroud)

然后它就会按照你所描述的那样行事。对于该函数的每次运行, 的默认值lst将是相同的列表(最初为空),并且传递给该函数的每个偶数将被添加到一个不断增长的列表中。

有关更多信息,请参阅“最不惊讶”和可变默认参数