对列表引用工作机制的误解:为何x[0].append(4)会影响y[0]的值
Python浅拷贝嵌套列表后修改原列表,拷贝对象同步变更的原因
该现象是copy模块的copy()方法实现浅拷贝的特性导致的,具体逻辑如下:
- 浅拷贝只会为复合对象(如嵌套列表)创建新的外层容器,不会递归拷贝内层的子对象,拷贝后的新容器内部存储的依旧是原容器子对象的引用,新旧容器的子元素指向同一块内存地址。
代码执行过程拆解
相关测试代码:
from copy import copy x = [[1], [2]] y = copy(x) x.append([3]) x[0].append(4) print(x) print(y)
运行输出:
>>> [[1, 4], [2], [3]] >>> [[1, 4], [2]]
每一步操作的影响:
- 执行
y = copy(x)时,仅创建了新的外层列表对象赋值给y,y和x的外层列表相互独立,但二者内部的两个子元素[1]、[2]指向完全相同的内存地址。 - 执行
x.append([3])时,是在x的独立外层列表中新增元素,不会影响y的外层列表,因此最终输出的y中没有[3]元素。 - 执行
x[0].append(4)时,操作的是x和y共享的第一个内层子列表对象,修改该对象的内容会同步反映到所有持有该引用的变量上,因此y的第一个元素也会同步变更为[1,4]。
如果要完全隔离两个嵌套列表的修改操作,可以使用copy.deepcopy()执行深拷贝,深拷贝会递归拷贝所有层级的子对象,新旧列表的所有元素都指向不同的内存地址,修改操作不会互相影响。
内容的提问来源于stack exchange,提问作者wowonline
相关产品推荐
相关产品推荐

