def func(list_=[], i=0):
i += 1
list_.append(i)
if i == 5:
return list_
return func(list_=list_, i=i)
out = func()
print(out)
out1 = func()
print(out1)
输出:
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
如果加入一段
def func(list_=[], i=0):
if i == 0:
list_ = []
i += 1
list_.append(i)
if i == 5:
return list_
return func(list_=list_, i=i)
out = func()
print(out)
out1 = func()
print(out1)
就正常了:
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
为什么会这样呢?
按照我的理解,在程序的第一行就已经对 list_这个列表清空了啊,为什么还要再做一次?
list_=[]是形参默认值,也就是说你传参的时候如果不传这个参数,那么使用一个空list作为参数
而如果你传入了参数,那么就用传入的实参作为参数
如果你仅需要一个空list,那么不要把它作为形参,没意义呀,传入一个带内容的list,函数里再把它清空,你是想闹哪样
第一行是函数默认值
list是可变对象,问题就在这里。第一次调用时已经将参数list_运行到[1,2,3,4,5]。虽然函数提供了默认参数,可由于list可变,因此默认值是被修改的(每次刷新的列表都是同个储存地址,指向同一个列表,归中修改了list_,参数列表中的值也会被修改),所以第二次调用函数list_是从[1,2,3,4,5]开始的。如果要做到每次从一个空列表递归,就是添加楼主所说的代码:
if i == 0:
list_ = 0
但整数,字符串一类,每个量储存地址不同,没有被修改的道理
列表作为函数的参数时,以为列表是可变的,所以函数调用时,list = [] 只会被创建一次,你的函数内部改变了list的存储,被创建的list就变为
[1, 2, 3, 4, 5],当你再次调用这个函数时,list还是会指向list原来的存储地址,所以就会出现这种情况
我在你的函数中添加了print(id(list_)) 来打印列表内存地址,你指定的地址是同一个内存
def func(list_=[], i=0):
i += 1
list_.append(i)
if i == 5:
return list_
print(id(list))
return func(list_=list_, i=i)
out = func()
print(out)
out1 = func()
print(out1)
输出:
140727827003168
140727827003168
140727827003168
140727827003168
[1, 2, 3, 4, 5]
140727827003168
140727827003168
140727827003168
140727827003168
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
把列表的内存ID打印出来,答案就清楚了。List在函数的参数里是可变对象,引用的默认参数在函数每次调用时都被改变了;
(请求采纳,最近在学Python技能树,需要五个回答被采纳,谢谢)
def func(list_=[], i=0):
print(id(list))
i += 1
list_.append(i)
if i == 5:
return list_
return func(list_=list_, i=i)
out = func()
print(out)
out1 = func()
print(out1)
out1 = func()
print(out1)
print(func())
————————————————————————————————————————————————————————
140727429913744
140727429913744
140727429913744
140727429913744
140727429913744
[1, 2, 3, 4, 5]
140727429913744
140727429913744
140727429913744
140727429913744
140727429913744
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
140727429913744
140727429913744
140727429913744
140727429913744
140727429913744
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
140727429913744
140727429913744
140727429913744
140727429913744
140727429913744
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
第一行是函数值