问题: Python中浅拷贝和深拷贝的区别是什么?

👇 点击展开/折叠 面试背诵模板(建议先背这个) 浅拷贝和深拷贝的区别仅对复合对象(即包含列表或类实例等其他对象的对象)有意义。浅拷贝创建一个新的复合对象,然后将原始对象中找到的对象的引用插入其中。深拷贝创建一个新的复合对象,然后递归地将原始对象中找到的对象的副本插入其中。简单来说:浅拷贝只复制最外层,内部嵌套对象仍共享引用;深拷贝递归复制所有层级,生成完全独立的新对象。赋值语句不复制对象,仅创建绑定关系。
---

核心区别图解

拷贝方式 操作对象 嵌套对象(子对象) 修改嵌套对象是否影响原对象
赋值 (=) 不复制,仅创建引用 完全共享 ✅ 是
浅拷贝 (copy.copy()) 创建新对象 共享引用 ✅ 是
深拷贝 (copy.deepcopy()) 创建新对象 递归创建新副本 ❌ 否

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
import copy

original = [[1, 2], [3, 4]]
shallow = copy.copy(original) # 浅拷贝
deep = copy.deepcopy(original) # 深拷贝

# 修改原列表中的子列表
original[0][0] = 'X'

print("原始列表:", original) # [['X', 2], [3, 4]]
print("浅拷贝结果:", shallow) # [['X', 2], [3, 4]] —— 受影响
print("深拷贝结果:", deep) # [[1, 2], [3, 4]] —— 独立不受影响

浅拷贝的三种实现方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import copy

original = [1, 2, [3, 4]]

# 方式1:copy模块的copy函数
shallow1 = copy.copy(original)

# 方式2:列表的copy方法
shallow2 = original.copy() # 或 dict.copy() / set.copy()

# 方式3:完整切片
shallow3 = original[:] # 仅适用于序列

# 验证:最外层独立,嵌套子对象共享
print(id(original) == id(shallow1)) # False(最外层不同)
print(id(original[2]) == id(shallow1[2])) # True(子对象共享)

深拷贝的注意事项

  • 必须使用 copy.deepcopy()
  • 递归对象(包含对自身引用的对象)可能导致递归循环,deepcopy() 通过维护 memo 字典避免该问题
  • 可能复制过多:如应该在副本之间共享的管理数据也被复制
  • 不可复制类型:模块、方法、文件、socket、栈帧等无法被深拷贝

性能与选型建议

维度 浅拷贝 深拷贝
速度 快 慢(递归复制所有层级)
内存占用 低 高
适用场景 仅第一层需要独立 需要完全独立的副本
时间复杂度 O(1)(仅复制引用) O(n)(递归复制所有对象)

可变对象与不可变对象的拷贝行为

  • 不可变对象(如整数、字符串、元组):浅拷贝和深拷贝无实际差异,因为无法修改其值
  • 可变对象(如列表、字典):浅拷贝时,嵌套的可变对象仍共享引用,修改会双向反映