如何在python的递归调用中全局存储值

时间:2019-06-09 10:42:10

标签: python python-3.x recursion dynamic-programming recursive-backtracking

我对python中的回溯方式有疑问。我如何存储在python中以递归方式在不同调用中形成的变量和列表(临时),我们知道,一旦形成的幂堆栈被破坏,变量的值也会被破坏。 例如:

avc=[]
var=0
def func(li,n,sumo,li2):
if sumo==n:
    global var
    var+=1
    #print(li2) ##line x
    adg(li2)
    return 
elif sumo>n:
    return 
else:
    for i in range(0,len(li)):
        li2.append(li[i])
        sumo=sum(li2)
        func(li,n,sumo,li2)
        li2.remove(li[i])

def adg(li3):
   global avc 
   avc.append(li3)
   #print("avc",avc)



if __name__=="__main__" :
   liq=list(map(int,input().strip().split()))
   n=liq[0]
   li=list(map(int,input().strip().split()))
   func(li,n,0,[])
   sumo=0
   count=0
   lis=[]
   j=0
   print(avc)

现在在第x行,它确实会打印列表,但是当我在程序末尾打印avc时,它会打印空列表。我希望将元素附加到avc。 请帮忙。

1 个答案:

答案 0 :(得分:0)

您应该更改

   avc.append(li3)

   avc.append(li3.copy())

那是因为avc通过引用来保存对li3的引用

 li2.remove(li[i])

您还从li3中删除了项目,因为您将li2传递给了adg,称为ad3。

通过在li3上调用.copy(),您将获得一个具有相同元素的新列表,因此,当您更改li2(或li3)时,复制的列表不会被更改。