python函数中的局部列表
我想在递归函数中创建一个局部列表。python函数中的局部列表,python,recursion,local,Python,Recursion,Local,我想在递归函数中创建一个局部列表。 def rec(chk,i): 这里chk是list,i是整数 我重复了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
def rec(chk,i):
这里chk是list,i是整数 我重复了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}
我该怎么做才能得到正确的结果。 提前谢谢。 以下是我的代码供参考:
实现中的问题是递归调用不接收列表的副本,而只是接收对同一列表的引用。将递归调用更改为
rec(list(chk), i)
提供所需的输出。调用
list
将创建列表的副本。您可以找到python如何处理参数的更详细概述。之所以发生这种行为,是因为您在不复制列表的情况下更改了该列表。因此,在每个递归中更改的列表总是相同的(指向相同的内存值)
像这样试试
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)
。正如蒂尔建议的那样。如果您正在处理列表下的列表。您需要。- 去掉全局
,这会不必要地使递归复杂化标志
- 不要修改原始列表,而是创建一个副本(
将创建一个新的连接列表,而chk+[i]
将修改原始列表)chk.append
您应该始终记住,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)
def rec(chk,i):
print(locals())
i += 1
chk = chk + [i]
if i != 4:
rec(chk, i)
print(locals())
rec([],0)
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)