代码之家  ›  专栏  ›  技术社区  ›  Niteya Shah

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

  •  -2
  • Niteya Shah  · 技术社区  · 8 年前

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

    数据点的结构 [名称\变量簇\编号唯一性\条件]

    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),则会打印所有正确的列表。

    2 回复  |  直到 8 年前
        1
  •  3
  •   Duncan    8 年前

    当你打电话 w.append(lis) 将引用附加到列表 lis ,不是列表的副本。附加到其中的所有内容 路易斯 当递归函数返回时也会弹出,这样您就可以进入 w 将大量引用到同一个空列表。

    同样,不要做 i in c.keys() 只是做 i in c 你不会给 W ,所以不需要使用 global w .

        2
  •  0
  •   Denziloe    8 年前

    运行

    w[0] is w[1]
    

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

    替代

    w.append(lis)
    

    具有

    w.append(lis.copy())
    

    是一个快速解决方案。但是,一般情况下要注意可变列表和引用列表。