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

Accessing a global variable in a recursive function

我编写了一个递归函数,它创建 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),所有正确的列表都会被打印出来。

运行

w[0] is w[1]

可能会帮助您理解失败的原因。您附加的引用都指向同一个对象。

正在替换

w.append(lis)

w.append(lis.copy())

是一个快速修复。但通常要小心变异列表和引用列表。

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

此外,不要做 i in c.keys(),只需做 i in c 并且您不会为 w 分配新值,因此无需使用 global w.