Python嵌套函数未返回外部定义变量的问题排查
解决嵌套递归函数中列表无法正确传递的问题
嘿,我帮你排查下这个问题哈,你的代码里有两个关键的小坑导致liketissuesets没法在函数间正确传递:
问题出在哪?
- 列表赋值的误区:你在
ind_list_renew里写的liketissuesets = liketissuesets + [common],其实并没有修改你传入的原列表——这行代码会创建一个全新的列表对象,然后把局部变量liketissuesets绑定到这个新对象上,而外部的原列表根本没被碰过。Python里可变对象的赋值是改变引用,不是修改原对象哦。 - 递归返回值丢失:递归调用
ind_list_renew(changinglist, liketissuesets)的时候,你没有把递归返回的结果传递回去,导致上层函数拿不到递归后的最终列表,自然就没法返回给find_like_tissues_set了。
修复后的代码
我调整了代码逻辑,用返回新列表的方式解决传递问题,同时让函数更独立:
#!/usr/bin/env python import numpy as np l1 = [1,2,3] l2=[2,3] l3=[1,2,3] l4=[2,3,4] l5=[2,3] mylist = [l1,l2,l3,l4,l5] def listidentity(v,b,f): if len(v)!= len(b): return [] for j in range(len(b)): if v[j]!=b[j]: return [] return [f] def ind_list_renew(changinglist, liketissuesets): a = changinglist[0] b = mylist[a] common = [] for f,v in enumerate(mylist): common += listidentity(v,b,f) print(f"当前找到的同子列表索引: {common}") # 创建新的分组集合,而不是修改局部引用 updated_sets = liketissuesets + [common] print(f"当前已分组集合: {updated_sets}") changinglist = changinglist.tolist() indtodelete = [j for j,k in enumerate(changinglist) if k in common] changinglist = np.delete(changinglist, indtodelete) if len(changinglist)!=0: # 递归时接收更新后的集合,再返回给上层 return ind_list_renew(changinglist, updated_sets) else: print('分组完成!最终集合:', updated_sets) return updated_sets def find_like_tissues_set(mylist): indoriginal = np.arange(len(mylist)) # 初始传入空集合,不用在外部提前定义 return ind_list_renew(indoriginal, []) # 调用测试 final_result = find_like_tissues_set(mylist) print(f"最终输出结果: {final_result}")
关键修改点
- 去掉了外部的
liketissuesets变量,让函数更独立,初始调用时传入空列表即可。 - 不再尝试修改传入的列表,而是每次创建新的
updated_sets,递归时传递这个新列表,并确保每一层递归都返回更新后的结果,这样上层函数就能拿到最终的分组集合。 - 简化了
listidentity的逻辑,去掉了多余的else分支(因为前面的return已经会退出函数,后面的代码自然是匹配成功的情况)。
运行这段代码,你会得到预期的输出:
当前找到的同子列表索引: [0, 2] 当前已分组集合: [[0, 2]] 当前找到的同子列表索引: [1, 4] 当前已分组集合: [[0, 2], [1, 4]] 当前找到的同子列表索引: [3] 当前已分组集合: [[0, 2], [1, 4], [3]] 分组完成!最终集合: [[0, 2], [1, 4], [3]] 最终输出结果: [[0, 2], [1, 4], [3]]
内容的提问来源于stack exchange,提问作者Meep
相关产品推荐
相关产品推荐

