python深拷贝和浅拷贝有什么区别 | What is the difference between deep copy and shallow copy of python

1.什么是深、浅拷贝?

浅拷贝会创建一个新的对象,但只复制原对象中引用的地址,不递归复制其内部的可变对象。
深拷贝会创建一个全新的对象,并递归地复制所有嵌套对象,确保新旧对象完全独立

2.深、浅拷贝的作用和问题

2.1浅拷贝

作用:

  • 节省内存和开销,速度快。
  • 适用于原始对象中不包含嵌套可变对象的情况,或者你希望内部对象共享的情况。

存在的问题:

  • 如果原对象中包含可变对象(如列表、字典等),对浅拷贝后的对象内部元素进行修改,会影响到原对象。

2.2深拷贝

作用:

  • 保证两个对象完全独立,修改一个不会影响另一个。
  • 适用于需要在操作过程中保留原始数据副本的场景,或用于临时备份、回滚、状态恢复等。

2.3总结

问题 深拷贝解决 浅拷贝解决
数据副本完全独立
节省资源和时间
嵌套数据修改安全
简单数据快速复制 也可 更快

3.能够用深、浅拷贝的数据结构

在Python中,可以进行深拷贝浅拷贝的数据结构包括:

  • 列表
    使用copy模块中的copy()deepcopy()函数进行浅拷贝和深拷贝。
  • 字典
    同样可以使用copy模块中的copy()deepcopy()函数进行浅拷贝和深拷贝。
  • 集合
    同样可以使用copy模块中的对应函数进行操作。
  • 自定义类对象
    如果自定义的类实现了__copy__()__deepcopy__()方法,则可以通过这些方法实现浅拷贝和深拷贝。
Python可变的数据结构(列表、字典、集合) Python自定义类对象
使用copy模块中的copy()deepcopy()函数进行浅拷贝和深拷贝。 __copy__()__deepcopy__()方法进行浅拷贝和深拷贝。
注意:元组是不可变数据结构,不能进行深浅拷贝

4.深、浅拷贝的原理图解

列表为例,逐步理解深拷贝与浅拷贝的区别:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import copy # 调用copy模块

a = [1,2,[1,2,[1,2,3],4,5],4,5] # 3层嵌套列表
# 直接赋值
b = a

# 浅拷贝
c = copy.copy(a) # 调用copy模块的copy()函数来浅拷贝
c[2][0] = 6
c[0] = 7

# 深拷贝
d = copy.deepcopy(a) # 调用copy模块的deepcopy()函数来深拷贝
d[2][2][0] = 8

调试来解读:

一、导入copy模块

调用copy模块

二、创建列表a


创建列表a

三、将列表a赋值给列表b,列表b指向同一个列表地址


将a赋值给b

四、对列表a进行浅拷贝,创建了列表c,使用copy模块的copy()函数

可以看到:列表a创建了一个新的对象——列表c,但不复制内部嵌套的对象列表c只复制了原对象列表a的引用,因此对任一对象的改动都会影响到另一个对象。

浅拷贝

五、对浅拷贝出来的列表c的值进行修改

对表层数据进行修改——原来的1变成了7,对第二层数据进行修改——原来的1变成了6。
印证了第四步的结论。

浅拷贝修改值

六、对列表a进行深拷贝,创建了列表d,使用copy模块的deepcopy()函数

可以看到:列表a创建了一个新的对象——列表d,同时递归地复制所有嵌套的对象这样即使内部嵌套对象被修改,原对象和复制对象也不会相互影响。

深拷贝

七、对浅拷贝出来的列表d的值进行修改

对第三层数据进行修改——原来的1变成了8。
印证了第六步的结论。

深拷贝修改值

5.深、浅拷贝的应用

  • 浅拷贝常用于:数据量大,结构简单,需要共享部分数据引用的场景。
  • 深拷贝常用于:需要完全独立的数据副本(如回溯算法、撤销功能、模拟数据操作等)。

感谢您的支持 | Thank you for supporting

python深拷贝和浅拷贝有什么区别 | What is the difference between deep copy and shallow copy of python
http://example.com/2025/05/07/deep_vs_shallow_for_py/
作者
Eli Bi
发布于
2025年5月7日
更新于
2025年5月7日
许可协议