Python 3.x Python:函数中的默认列表 来自Summerfield在Python3中的编程:
内容如下: 如果给定默认值,则在执行def语句时创建默认值,而不是在调用函数时创建默认值。 但我的问题是关于以下示例:Python 3.x Python:函数中的默认列表 来自Summerfield在Python3中的编程:,python-3.x,default-arguments,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 作为第一次执行定义,lst是指向无的 但是在函数调用之后,如果偶数为(2),则追加 lst不应该指向[2],因为在lst.a
def append_if_even(x, lst =None):
lst = [] if lst is None else lst
if x % 2 ==0:
lst.append(x)
return lst
作为第一次执行定义,lst是指向无的
但是在函数调用之后,如果偶数为(2),则追加
- lst不应该指向[2],因为在lst.append(x)之后,lst不再指向None了吗
- 为什么下一次执行仍然使lst指向none
- 如果偶数(2),在这个函数调用append\u中到底发生了什么
lst=None
,lst=[]来防止的,如果lst不是其他lst
构造。虽然函数的默认参数在编译时只计算一次,但每次执行函数时都会计算函数中的代码。因此,每次执行函数时,如果没有为lst
传递值,它将以默认值None
开始,然后在执行函数的第一行时立即被新的空列表替换
如果您改为这样定义函数:
def append_if_even(x, lst=[]):
if x % 2 ==0:
lst.append(x)
return lst
然后它就会像你描述的那样。对于函数的每次运行,lst
的默认值将是相同的列表(最初为空),传递给函数的每个偶数将添加到一个不断增长的列表中
有关详细信息,请参阅
lst不应该指向[2],因为在lst.append(x)之后,lst不再指向None了吗?为什么下一次执行仍然使lst指向none
这正是您通过使用lst=None
,lst=[]来防止的,如果lst不是其他lst
构造。虽然函数的默认参数在编译时只计算一次,但每次执行函数时都会计算函数中的代码。因此,每次执行函数时,如果没有为lst
传递值,它将以默认值None
开始,然后在执行函数的第一行时立即被新的空列表替换
如果您改为这样定义函数:
def append_if_even(x, lst=[]):
if x % 2 ==0:
lst.append(x)
return lst
然后它就会像你描述的那样。对于函数的每次运行,lst
的默认值将是相同的列表(最初为空),传递给函数的每个偶数将添加到一个不断增长的列表中
有关更多信息,请参阅。参数
x
和lst
不是全局参数。因此,设置它们对第二次调用没有影响。就是说,在创建函数之后,它会为该函数的默认参数创建一个内存空间。当需要默认参数时,此本地lst将分配给创建的空间,值为None?这就是python中默认参数的工作方式吗?@wllLiu:只有一个None
。但是假设您指定了lst=[]
。它将构造一个列表。如果未指定lst
,则lst
将引用该列表。否则,将返回给定的参数。但是设置参数本身没有影响。参数x
和lst
不是全局参数。因此,设置它们对第二次调用没有影响。就是说,在创建函数之后,它会为该函数的默认参数创建一个内存空间。当需要默认参数时,此本地lst将分配给创建的空间,值为None?这就是python中默认参数的工作方式吗?@wllLiu:只有一个None
。但是假设您指定了lst=[]
。它将构造一个列表。如果未指定lst
,则lst
将引用该列表。否则,将返回给定的参数。但是设置参数本身没有影响。