Python递归中变量联动更新导致排列结果异常的问题排查与修正
问题根源
你代码返回全空列表的核心原因是Python列表是可变对象,你存储的是列表引用而非内容副本:
- 当执行
store += [subarr]时,并没有把subarr当前的元素复制一份存进store,只是把subarr这个列表对象的引用(相当于内存地址)加了进去。 - 递归回溯时,你反复调用
subarr.remove(set[i])修改同一个列表对象,而store里的所有条目都指向这个对象。等所有递归走完回溯完成,subarr被清空,store里自然全是空列表。
修正方案
只需要在保存结果时,存subarr的副本而不是引用。两种简单实现方式:
- 用
list(subarr)创建副本 - 用
subarr.copy()创建副本
同时顺便优化了变量名(避免用Python内置关键字set、用语义更清晰的used替代map),修改后的完整代码:
def perm(n, set_list, subarr, used, store): if len(subarr) == n: # 关键:存储副本而非原列表引用 store.append(list(subarr)) else: for i in range(n): if set_list[i] not in used: used.append(set_list[i]) subarr.append(set_list[i]) perm(n, set_list, subarr, used, store) used.remove(set_list[i]) subarr.remove(set_list[i]) return store # 替换内置关键字set为set_list,避免语法冲突 set_list = [1, 2, 3] n = len(set_list) subarr = [] used = [] # 替换map为used,语义更明确 store = [] print(perm(n, set_list, subarr, used, store))
运行后会输出正确的排列结果:[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
内容的提问来源于stack exchange,提问作者Sourya
相关产品推荐
相关产品推荐

