Python用list()复制嵌套列表后修改新列表为何会改动原列表?
你的猜测完全正确,这个问题的核心是浅拷贝和深拷贝的区别:
两种场景表现差异的原因
list(list0)属于浅拷贝操作,它只会创建一个新的外层列表对象,列表内部存储的元素仍然是原列表元素的引用,不会递归复制内层的嵌套对象。
- 第一种场景:你修改的是
list2[0][0],也就是嵌套子列表的内部元素。此时list2[0]和list0[0]指向同一个子列表对象,修改该对象的内部属性自然会同步到所有引用它的地方,所以原列表list0也会发生变化。 - 第二种场景:你修改的是
list2[0]本身,也就是直接给外层列表的第0位重新赋值了一个全新的列表对象,此时list2[0]的指向已经和list0[0]断开关联,所以原列表不会受到影响。
实现完全独立拷贝的方案
如果需要无论修改任何层级的内容都不会影响原列表,需要使用深拷贝,递归复制所有层级的可变对象:
- 导入Python标准库中的
copy模块 - 使用
copy.deepcopy()方法完成拷贝,示例代码如下:
import copy list0 = [[0,1,2],[3,4,5],[5,6,7]] list2 = copy.deepcopy(list0) list2[0][0] = 20 print(list0) # 输出 [[0, 1, 2], [3, 4, 5], [5, 6, 7]],原列表不受影响 print(list2) # 输出 [[20, 1, 2], [3, 4, 5], [5, 6, 7]]
补充说明
常见的浅拷贝操作除了list(),还有切片[:]、列表推导式、copy.copy()方法,这些操作仅在列表所有元素都是不可变类型(比如数字、字符串、元组)时可以实现完全独立的效果,只要列表包含嵌套的可变对象(列表、字典、自定义类实例等),就需要使用深拷贝避免联动修改。
内容的提问来源于stack exchange,提问作者StarBucK
相关产品推荐
相关产品推荐

