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)