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
相关产品推荐
相关产品推荐

