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



我写了一个递归函数,它创建了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 中,但最终我得到了一个空列表,我哪里出错了,任何帮助将不胜感激

附言:如果写入打印(LIS(而不是W.Append(LIS(,则打印所有正确的列表。

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

另外,不要做i in c.keys(),只做i in c,你不会给w分配一个新值,所以没有必要使用global w

运行

w[0] is w[1]

可能会帮助您了解它失败的原因。已追加的引用都指向同一对象。

取代

w.append(lis)

w.append(lis.copy())

是一个快速解决方案。但通常要小心更改列表和引用列表。

最新更新