赋值、浅拷贝、深拷贝的根本区别在于对象引用关系的处理方式:赋值仅增加引用,不创建新对象;浅拷贝新建容器但共享内部可变元素;深拷贝递归创建所有嵌套对象的独立副本。

赋值、浅拷贝、深拷贝的根本区别在于:它们对对象引用关系的处理方式不同——赋值不创建新对象,只增加一个引用;浅拷贝创建新容器,但内部元素仍共享原对象;深拷贝则递归地创建所有嵌套对象的全新副本。
赋值:只是绑定新名字
赋值操作(=)不复制数据,只是让变量名指向同一个内存地址。修改可变对象会影响所有引用它的地方。
- a = [1, 2, [3, 4]]
- b = a # b 和 a 指向同一列表
- b.append(5) → a 也变成 [1, 2, [3, 4], 5]
- id(a) == id(b) 为 True
浅拷贝:复制顶层容器,不复制内容
浅拷贝(如 copy.copy()、list[:]、dict.copy())生成一个新对象,但其中的可变元素(如嵌套列表、字典)仍是原对象的引用。
- import copy
- a = [1, 2, [3, 4]]
- b = copy.copy(a) 或 b = a[:]
- id(a) != id(b),但 id(a[2]) == id(b[2])
- 修改 b[0] 不影响 a;但修改 b[2].append(5) 会同步到 a[2]
深拷贝:彻底隔离,完全独立
深拷贝(copy.deepcopy())递归遍历整个对象结构,为每个子对象都创建新副本,确保新旧对象之间无任何共享引用。
立即学习“Python免费学习笔记(深入)”;
- c = copy.deepcopy(a)
- id(a) != id(c),且 id(a[2]) != id(c[2])
- 无论修改 c 的哪一层,a 都不会变化
- 代价较高,尤其对深层嵌套或含循环引用的对象;不可序列化的对象(如文件句柄、线程锁)无法深拷贝
怎么选?看你的需求
是否需要修改副本而不影响原数据?是否涉及嵌套可变对象?
- 只想多一个名字用 → 用赋值
- 只有一层结构(如纯数字列表),且不改内部元素 → 浅拷贝够用
- 有嵌套列表/字典/自定义对象,又需完全独立 → 必须深拷贝
- 不确定结构深度?优先考虑 deepcopy,再根据性能瓶颈优化










