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

Python全排列算法中array与array[:]的运行差异原因求解

问题原理说明

这个问题的核心是Python中可变对象的引用传递特性,列表属于典型的可变对象,操作时默认传递的是内存地址引用而非内容副本。

两种写法的本质差异

  • 当使用permutation.append(array)时:
    你追加到结果列表里的不是当前array的内容,只是指向这个数组对象的内存引用,你整个递归全排列过程中所有操作都是在修改同一个array对象,后续回溯阶段执行的swap操作会不断修改这个array的内容,之前已经追加到结果列表里的所有引用指向的内容也会同步被修改,最终递归结束后所有引用指向的都是回溯完成后的最终array状态,所以结果里全是重复的数组。
  • 当使用permutation.append(array[:])时:
    array[:]是Python的全切片语法,会基于当前array的内容生成一个全新的独立列表副本,这个副本和原array的内存地址完全分离,后续不管你怎么修改原array的内容,都不会影响已经存入结果列表的副本,所以每个base case触发时的全排列状态都会被完整保留下来,结果就是正确的。

简易验证示例

你可以通过这段极简代码直观感受引用和副本的区别:

origin = [1,2,3]
ref = origin
copy = origin[:]

origin[0] = 999
print(ref)  # 输出 [999, 2, 3],引用和原对象同步修改
print(copy) # 输出 [1, 2, 3],副本和原对象完全独立

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:48:03