为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑8549860 2021-06-04 01:17:52
我编写了一个递归函数,它创建 nx3 数据的所有可能结果的组合,其中 n 是可变的数据点的结构[name_of_variable cluster_number uniqueness_condition]from collections import defaultdictx= [[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) 打印所有正确的列表。
查看完整描述

2 回答

?
温温酱

TA贡献1752条经验 获得超4个赞

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

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


查看完整回答
反对 回复 2021-06-15
?
慕娘9325324

TA贡献1783条经验 获得超4个赞

跑步

w[0] is w[1]

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

更换

w.append(lis)

w.append(lis.copy())

是一个快速修复。但是一般来说,变异列表和引用列表要小心。


查看完整回答
反对 回复 2021-06-15
  • 2 回答
  • 0 关注
  • 264 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号