Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python:函数中的默认列表 来自Summerfield在Python3中的编程:_Python 3.x_Default Arguments - Fatal编程技术网

Python 3.x Python:函数中的默认列表 来自Summerfield在Python3中的编程:

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语句时创建默认值,而不是在调用函数时创建默认值。 但我的问题是关于以下示例:

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不应该指向[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
的默认值将是相同的列表(最初为空),传递给函数的每个偶数将添加到一个不断增长的列表中

有关详细信息,请参阅

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
将引用该列表。否则,将返回给定的参数。但是设置参数本身没有影响。