Python列表浅拷贝问题:追加副本修改原列表后另一列表同步变更原因
问题形成原因
该问题本质是Python中浅拷贝的特性导致的:
- Python列表的
copy()方法(以及切片操作k[:])都属于浅拷贝,对于嵌套结构的列表(即此处的二维列表),浅拷贝只会创建一个新的外层列表容器,新列表里存储的还是原列表内部子列表的引用,并不会复制子列表本身。 - 执行
a.append(k.copy())时,仅把k的外层列表复制了一份存入a,a中存储的这个外层列表里的9个子列表,和原k变量的9个子列表指向完全相同的内存对象。因此后续修改k[i][j]的值时,本质修改的是共享的子列表对象,a中对应的数据自然会同步变化。
可行解决方案
针对该场景,常见的解决方案有两种:
- 方案1:使用标准库的深拷贝方法(通用所有嵌套层级)
导入copy模块的deepcopy方法,深拷贝会递归复制所有层级的嵌套对象,完全不共享原对象的引用:import copy # 把原来的a.append(k.copy())改成下面的代码 a.append(copy.deepcopy(k)) - 方案2:手动生成二维列表的全量拷贝(仅适用于二维列表,性能更优)
用列表推导式给每一层子列表都做一次浅拷贝,即可实现二维列表的完全复制,不需要额外导入模块,性能比深拷贝更高:# 把原来的a.append(k.copy())改成下面的代码 a.append([row.copy() for row in k])
内容的提问来源于stack exchange,提问作者Shubh Shah
相关产品推荐
相关产品推荐

