wil*_*Liu 4 python-3.x default-arguments
它的意思如下:当给出默认值时,它们是在执行 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?
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将是相同的列表(最初为空),并且传递给该函数的每个偶数将被添加到一个不断增长的列表中。
有关更多信息,请参阅“最不惊讶”和可变默认参数。
| 归档时间: |
|
| 查看次数: |
31783 次 |
| 最近记录: |