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 |
|
调试来解读:
一、导入copy模块
二、创建列表a
三、将列表a赋值给列表b,列表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/