You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python递归中变量联动更新导致排列结果异常的问题排查与修正

问题根源

你代码返回全空列表的核心原因是Python列表是可变对象,你存储的是列表引用而非内容副本:

  • 当执行store += [subarr]时,并没有把subarr当前的元素复制一份存进store,只是把subarr这个列表对象的引用(相当于内存地址)加了进去。
  • 递归回溯时,你反复调用subarr.remove(set[i])修改同一个列表对象,而store里的所有条目都指向这个对象。等所有递归走完回溯完成,subarr被清空,store里自然全是空列表。
修正方案

只需要在保存结果时,存subarr的副本而不是引用。两种简单实现方式:

  1. 用list(subarr)创建副本
  2. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:35:30