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

Python回溯生成列表排列时append的结果全为空的原因是什么

问题原因解答

核心原因和Python的可变对象引用机制有关:

  • 列表属于可变对象,代码中所有操作的curr变量存储的不是列表的实际值,而是列表对象在内存中的地址引用,全程你使用的都是同一个curr列表对象,所有append、pop操作都是直接修改该内存地址下存储的内容。
  • 你在终止条件中执行res.append(curr)时,实际是把curr的内存引用追加到了res中,而非把当前curr的快照值复制一份存入res。也就是说最终res里的4个元素,全部指向同一个curr对象的内存地址。
  • 回溯过程中每次递归返回后都会执行curr.pop(),该操作会直接修改公共的curr对象内容,res中所有指向该地址的元素自然会同步发生变化。等整个回溯流程执行完毕,curr的所有元素已经被全部弹出变成空列表,最终打印res时自然就会输出4个空列表。
  • 改用res.append(curr.copy())能修复问题的原因是:copy()会基于当前curr的值生成一个全新的独立列表对象,将这个新对象的引用存入res后,后续对原curr的任何修改都不会影响到这个已经存进去的新对象,所以可以正确保留每一步的结果。

你可以通过打印id验证这个逻辑:在res.append(curr)之后新增代码print(id(curr)),会发现4次打印的id完全相同,说明res存的是同一个对象的引用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:24:01