我想在递归函数中创建一个本地列表。
def rec(chk,i):
这里chk是list,我是一个整数
我重复递归4次,并期望出现
{'chk':[],'i':0}
{'chk':[1],'i':1}
{'chk':[1,2],'i':2}
{'chk':[1,2,3],'i':3}
{'chk':[1,2,3],'i':3}
{'chk':[1,2],'i':2}
{'chk':[1],'i':1}
但相反它给了我:
{'chk':[],'i':0}
{'chk':[1],'i':1}
{'chk':[1,2],'i':2}
{'chk':[1,2,3],'i':3}
{'chk':[1,2,3,4],'i':3}
{'chk':[1,2,3,4],'i':2}
{'chk':[1,2,3,4],'i':1}
我该怎么做才能以正确的方式获得它。
提前致谢。
供参考这里是我的代码:
flag=0
def rec(chk,i):
global flag
print(locals())
i+=1
chk.append(i)
if(i==4):
flag=1
if(flag==1):
return
else:
rec(chk,i)
print(locals())
rec([],0)
答案 0 :(得分:2)
发生此行为是因为您正在更改该列表而不复制它。因此,您在每次递归中更改的列表始终是相同的(指向相同的内存值)。
试试这样;
flag=0
def rec(chk,i):
global flag
print(locals())
i+=1
chk.append(i)
if(i==4):
flag=1
if(flag==1):
return
else:
rec(chk[:],i)
print(locals())
rec([],0)
chk[:]
与list(chk)
同等。正如蒂尔所说。如果您正在处理列表下的列表。您需要Deep copy。
答案 1 :(得分:1)
flag
,这会使不必要的递归变得复杂chk + [i]
会创建一个新的连接列表,而chk.append
会修改原始列表)所以:
def rec(chk,i):
print(locals())
i += 1
chk = chk + [i]
if i != 4:
rec(chk, i)
print(locals())
rec([],0)
答案 2 :(得分:0)
您的实现的问题是递归调用不会收到列表的副本,而只是对同一列表的引用。将递归调用更改为
rec(list(chk), i)
给出所需的输出。对list
的调用会创建列表的副本。您可以更详细地了解python如何处理参数images.weserv.nl。
答案 3 :(得分:0)
你应该记住,python中的参数是“引用”而不是值。因此,您不会在每次递归中处理不同的列表,而是每次都使用同一个列表。为了得到你想要的东西,你应该总是复制一份清单。
flag=0
def rec(chk,i):
lst=list(chk)
global flag
print(locals())
i+=1
lst.append(i)
if(i==4):
flag=1
if(flag==1):
return
else:
rec(lst,i)
print(locals())
rec([],0)