在递归函数中访问全局变量
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
.
我编写了一个递归函数,它创建 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
.