函数python中的本地列表

时间:2016-02-21 18:16:25

标签: python recursion local

我想在递归函数中创建一个本地列表。
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)

4 个答案:

答案 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)