You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

逐行解释执行过程:

  1. 执行a = [1,2,3]:内存中生成一个存储1、2、3的列表对象,变量a持有该对象的引用。
  2. 执行b = [a.copy(), a]:
    • 第一个元素a.copy()会为a指向的列表新建一个拷贝对象(我们暂称其为对象X),b的第一个位置存储对象X的引用
    • 第二个位置直接存储a所持有的引用,指向最开始生成的[1,2,3]列表
  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

你存在的认知误区:浅拷贝的“相互独立”仅针对外层容器本身,而非容器内元素指向的底层对象。比如你执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 23:15:10