python函数调用继承

python函数调用继承,python,function,inheritance,Python,Function,Inheritance,我是新人。下面是python文档中的一个示例 def funtest(num, L=[]): L.append(num) return L print(funtest(2)) print(funtest(3)) print(funtest(4)) 我认为每个函数调用都应该执行相同的事情,这意味着在每个函数调用中L=[]。所以我认为输出应该是这样的: [2] [3] [4] 但真正的答案在下面。看起来funtest()继承了上次函数调用的输出。然后不断地将其传递给下一个函数调用

我是新人。下面是python文档中的一个示例

def funtest(num, L=[]):
    L.append(num)
    return L
print(funtest(2))
print(funtest(3))
print(funtest(4))
我认为每个函数调用都应该执行相同的事情,这意味着在每个函数调用中L=[]。所以我认为输出应该是这样的:

[2]
[3]
[4]
但真正的答案在下面。看起来funtest()继承了上次函数调用的输出。然后不断地将其传递给下一个函数调用。我弄糊涂了

[2]
[2, 3]
[2, 3, 4]
当我将代码更改为以下情况时:

def funtest(L=[]):
    L.append(L)
    return L
print(funtest([2]))
print(funtest([3]))
print(funtest([4]))
实际输出如下所示:

[2, [...]]
[3, [...]]
[4, [...]]

输出与前一个有很大不同。我现在更糊涂了。有人修复我的精神创伤吗?非常感谢

问题是L的默认值是一个可变对象(在您的例子中是一个空列表)。
在Python中,默认值在函数定义时计算。
每次调用该函数时,都会得到相同的默认值,如果向对象(列表)添加任何内容,则会得到以前添加的所有内容

获取默认列表(或字典或集合)的正确方法是在函数内部的运行时创建它。
这是Python中初学者开发人员的常见错误

您想阅读类似的问题:



问题是L的默认值是一个可变对象(在您的例子中是一个空列表)。
在Python中,默认值在函数定义时计算。
每次调用该函数时,都会得到相同的默认值,如果向对象(列表)添加任何内容,则会得到以前添加的所有内容

获取默认列表(或字典或集合)的正确方法是在函数内部的运行时创建它。
这是Python中初学者开发人员的常见错误

您想阅读类似的问题:



为了解释正在发生的事情

第一个案例

因此python函数中的默认值仅在定义函数时实例化一次,因此列表仅在定义函数时创建,并且您不断向其中添加,因此现在结果包含所有旧值

对于在python中用作参数默认值时可变的所有值,都是如此

你能做什么

通常使用不可变值,对于list,您使用
None
作为默认值,在函数中检查list是否为
None
,并在函数中创建一个空列表

请在此处阅读更多信息(第一个问题):

第二种情况

现在,当您执行
L.append(L)

每当列表太大而无法打印时,python就会在其位置显示这三个点


请在此处阅读更多信息,以解释正在发生的事情

第一个案例

因此python函数中的默认值仅在定义函数时实例化一次,因此列表仅在定义函数时创建,并且您不断向其中添加,因此现在结果包含所有旧值

对于在python中用作参数默认值时可变的所有值,都是如此

你能做什么

通常使用不可变值,对于list,您使用
None
作为默认值,在函数中检查list是否为
None
,并在函数中创建一个空列表

请在此处阅读更多信息(第一个问题):

第二种情况

现在,当您执行
L.append(L)

每当列表太大而无法打印时,python就会在其位置显示这三个点


在此处阅读更多信息

将L移到函数内部

def funtest(num):
    L=[]
    L.append(num)
    return L
print(funtest(2))
print(funtest(3))
print(funtest(4))
这将重新设置L


将L移到函数内部

def funtest(num):
    L=[]
    L.append(num)
    return L
print(funtest(2))
print(funtest(3))
print(funtest(4))
这将重新设置L


这是否回答了您的问题@是的。我以前没有搜索过。这能回答你的问题吗@是的。我以前没有搜索过它。开始时L是空的,为什么它通过L.append(L)变成无穷大?我的意思是它只是一无所有。谢谢我明白了。你用[2]来调用它,是的,递归地将空列表添加到它本身也将转到无穷远为什么第二个案例没有显示这样的输出:[2,[…][2,3,[…][2,3,4,[…]]L在开始时是空的,为什么它通过L.append(L)转到无穷远?我的意思是它只是一无所有。谢谢我明白了。你用[2]调用它,是的,递归地将空列表添加到它本身也会无限大。为什么第二种情况没有显示这样的输出:[2,[…][2,3,[…]][2,3,4,[…]]在函数中移动L=[]可以解决你的问题,积累可以是一个有用的特性。您可以通过调用带有空白列表的函数来重置它:print(funtest(5,[]),而在函数中移动L=[]可以解决您的问题,积累可以是一个有用的功能。您可以通过调用带有空白列表的函数来重置它:print(funtest(5,[]))