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

Python回溯实现全排列时添加到结果集的列表为空是什么原因?

问题原因分析

核心原因是Python中可变对象的引用传递特性:

  • 你代码中的tmpResult是列表类型,属于可变对象,整个回溯流程中你始终操作的是同一个tmpResult实例,每次往res里append(tmpResult)的时候,实际存储的是这个列表的内存引用,而非当前时刻的列表值副本。
  • 回溯逻辑的末尾你执行了tmpResult.pop()进行状态回滚,当整个递归流程全部结束时,tmpResult已经被逐步弹出所有元素变成了空列表,res里存储的所有引用都指向同一个已经清空的tmpResult,所以最终打印出来全是空列表。
修改为repr后正常的原因

repr(tmpResult)会根据当前列表的内容生成一个全新的字符串对象,字符串是Python中的不可变对象,生成后就不会再被修改,你存入res的是这个独立的字符串副本,后续tmpResult的修改不会影响已经生成的字符串,所以可以正常保留每一步的结果。

正确的修复方案

如果你希望res存储的是列表类型而非字符串,在添加结果时拷贝一份当前tmpResult的副本即可,可选写法如下:

res.append(tmpResult.copy())
# 或者
res.append(list(tmpResult))
# 或者
res.append(tmpResult[:])

内容的提问来源于stack exchange,提问作者zarkli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:18:00