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),
不应该指向 [2],因为在 lst.append(x) 之后不再指向 None ?
为什么下一次执行还是让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=None
、lst = [] 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。
来自 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),
不应该指向 [2],因为在 lst.append(x) 之后不再指向 None ?
为什么下一次执行还是让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=None
、lst = [] 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。