猿问

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

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


ps 如果写 print(lis) 而不是 w.append(lis) 打印所有正确的列表。


慕尼黑8549860
浏览 265回答 2
微课
2回答

温温酱

当您打电话时,w.append(lis)您将引用附加到列表lis,而不是列表的副本。lis当递归函数返回时,您附加的所有内容也会弹出,因此您将获得的所有内容w将是对同一个空列表的大量引用。另外,不要做i in c.keys(),只要做i in c,你就不会为 分配一个新值w,所以没有必要使用global w.

慕娘9325324

跑步w[0] is w[1]可能会帮助您了解它失败的原因。您附加的所有引用都指向同一个对象。更换w.append(lis)和w.append(lis.copy())是一个快速修复。但是一般来说,变异列表和引用列表要小心。
随时随地看视频慕课网APP

相关分类

Python
我要回答