在递归函数中访问全局变量

时间:2018-09-11 11:09:13

标签: python recursion global

我写了一个递归函数,它创建nx3数据(其中n是变量)的所有可能结果的组合

数据点的结构 [name_of_variable cluster_number uniqueness_condition]

from collections import defaultdict
x= [[1,1,'a'],[2,1,'b'],[3,1,'c'],[4,2,'c'],[5,2,'d'],[6,2,'a'],[7,3,'a'],[8,3,'d']]
c=defaultdict(list)
for i in x:
    c[i[1]]+=[i]
w=list()
def rec_cal(i,lis):
    if i in c.keys():
        for j in c[i]:
            lis.append(j[0])
            rec_cal(i+1,lis)
            lis.pop()
    else:
        global w
        w.append(lis)##print(lis)
rec_cal(1,[])

我试图将所有生成的3对存储在w中,但是最后我得到一个空列表,我在哪里出错了,将不胜感激任何帮助

p.s。如果写print(lis)而不是w.append(lis),则所有正确的列表都会被打印。

2 个答案:

答案 0 :(得分:3)

调用w.append(lis)时,会将引用附加到列表lis,而不是列表的副本。递归函数返回时,您追加到lis的所有内容也会弹出,因此您在w中得到的所有内容都是对同一空列表的大量引用。

此外,不要执行i in c.keys(),而只是执行i in c,并且您没有为w分配新值,因此不需要使用global w

答案 1 :(得分:0)

运行

w[0] is w[1]

可以帮助您了解失败的原因。您添加的所有引用均指向同一对象。

替换

w.append(lis)

使用

w.append(lis.copy())

是一种快速修复。但通常要谨慎使用变数列表和引用列表。