为何无法向列表正确追加y的值?Python代码问题咨询
Python列表全排列代码问题分析
问题重现
运行以下Python代码意图生成原列表的全排列,但最终result中的元素并非预期的排列结果,而是移除x后的子列表:
a=[1,2,3] result=[] for i in range(len(a)): x=a[i] y=a[:i]+a[i+1:] tuple(y) for j in range(len(a)): list(y) y.insert(j,x) result.append(y) print(y) y.remove(x) print(result)
运行输出
[1, 2, 3] [2, 1, 3] [2, 3, 1] [2, 1, 3] [1, 2, 3] [1, 3, 2] [3, 1, 2] [1, 3, 2] [1, 2, 3] [[2, 3], [2, 3], [2, 3], [1, 3], [1, 3], [1, 3], [1, 2], [1, 2], [1, 2]] Process finished with exit code 0
问题原因
核心问题是**result.append(y)添加的是列表y的引用而非副本**,后续执行y.remove(x)会直接修改result中已存在的元素——因为它们指向同一个内存对象。当循环结束时,所有result里的元素最终都指向了执行完y.remove(x)后的y,也就是移除x后的子列表。
修复方案
要解决这个问题,需要在append时添加y的副本而非引用,常见实现方式有三种:
- 使用列表切片创建副本:
result.append(y[:]) - 使用
list()构造函数创建副本:result.append(list(y)) - 使用
copy()方法:result.append(y.copy())
修改后的代码示例(同时去掉无意义的tuple(y)和list(y)语句):
a=[1,2,3] result=[] for i in range(len(a)): x=a[i] y=a[:i]+a[i+1:] for j in range(len(a)): y.insert(j,x) result.append(y[:]) # 添加列表副本 print(y) y.remove(x) print(result)
运行后result将正确输出全排列:
[[1, 2, 3], [2, 1, 3], [2, 3, 1], [2, 1, 3], [1, 2, 3], [1, 3, 2], [3, 1, 2], [1, 3, 2], [1, 2, 3]]
内容的提问来源于stack exchange,提问作者Naruto Naruto
相关产品推荐
相关产品推荐

