Python中对浅拷贝生成的变量再次执行浅拷贝的元素同一性疑问
Python浅拷贝运行结果疑问解答
首先先明确Python列表浅拷贝的核心规则:
- 对列表执行
copy()方法做浅拷贝时,仅会新建一个外层列表容器,容器内存储的所有元素的引用会完全复制自原列表,不会递归复制元素指向的底层对象。
你贴出的代码执行逻辑拆解如下:
a = [1,2,3] b = [a.copy(), a] c = b.copy() print(b[0] is c[0]) # 输出 True print(c[1] is a) # 输出 True
逐行解释执行过程:
- 执行
a = [1,2,3]:内存中生成一个存储1、2、3的列表对象,变量a持有该对象的引用。 - 执行
b = [a.copy(), a]:- 第一个元素
a.copy()会为a指向的列表新建一个拷贝对象(我们暂称其为对象X),b的第一个位置存储对象X的引用 - 第二个位置直接存储a所持有的引用,指向最开始生成的[1,2,3]列表
- 第一个元素
- 执行
c = b.copy():为b新建一个外层列表容器作为c,c的两个元素直接复制b中存储的两个引用:- c的第一个元素和b[0]持有同一个对象X的引用,因此
b[0] is c[0]结果为True - c的第二个元素和b[1]一样持有a指向的列表的引用,因此
c[1] is a结果为True
- c的第一个元素和b[0]持有同一个对象X的引用,因此
你存在的认知误区:浅拷贝的“相互独立”仅针对外层容器本身,而非容器内元素指向的底层对象。比如你执行b.append(4),c不会新增元素;你执行b[0] = [5,6,7]把b[0]的引用指向新对象,c[0]也不会变化,这就是外层容器独立的体现。但只要你没有修改元素的引用指向,元素指向的底层对象本身是被两个列表共用的。
你可以做额外测试验证:执行b[0].append(9),再打印c[0],会发现c[0]也新增了元素9,本质就是两者指向同一个底层对象。
内容的提问来源于stack exchange,提问作者asd-qwert
相关产品推荐
相关产品推荐

