python 基础:copy和deepcopy详解

python 的copy 模块提供了 copydeepcopy 两个函数来拷贝对象。copy.copy 函数用于浅拷贝,而copy.deepcopy 函数用于深拷贝

  • 我们寻常意义的拷贝就是深拷贝,即将被拷贝对象完全再拷贝一遍作为独立新个体单独存在。所以改变原有被拷贝对象不会对已经拷贝出来的新对象产生影响。
  • 浅拷贝并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签(相当于c++中的引用),所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变。这就和我们寻常意义上的拷贝有所不同了。

示例

案例1

py 复制代码
import copy
 
#浅复制
list = [1, [2, 3], [4, 5]]
shallow_copy = copy.copy(list)
 
#深复制
deep_copy = copy.deepcopy(list)
 
#修改原始对象中的嵌套列表
list[1][0] = 'X'
 
print(list)           #[1, ['X', 3], [4, 5]]
print(shallow_copy)   #[1, ['X', 3], [4, 5]]  (共享嵌套列表的引用)
print(deep_copy)      #[1, [2, 3], [4, 5]]    (独立的嵌套列表)
  • 可以看到原数据list改变, 浅拷贝shallow_copy数据也跟着改变
  • deep_copy: 它是从原对象list独立出来的副本,不会随着原对象的改变而改变

案例2

py 复制代码
>>> import copy
>>> origin = [1,2,[3,4]]
#origin里边有三个元素:1,2,[3,4]
>>> cop1 = copy.copy(origin)
>>> cop2 = copy.deepcopy(origin)
>>> cop1 == cop2
True
>>>cop1 is cop2
False
#cop1和cop2看上去相同,但已不再是同一个object
>>> origin[2][0] = "hey!"
>>> origin
[1,2,['hey!',4]]
>>>cop1
[1,2,['hey!', 4]]
>>> cop2
[1,2,[3,4]]
#把origin内的子list [3,4]改掉了一个元素,观察cop1和cop2
  • 可以看到 cop1,也就是 shallow copy 跟着 origin 改变了。而 cop2 ,也就是 deep copy 并没有变
  • 似乎 deep copy 更加符合我们对复制的直觉定义: 一旦复制出来了,就应该是独立的了。如果我们想要的是一个字面意义的copy,那就直接用 deep_copy 即可。

参考: https://www.jb51.net/article/264894.htm

相关推荐
CryptoRzz几秒前
越南k线历史数据、IPO新股股票数据接口文档
java·数据库·后端·python·区块链
chenchihwen12 分钟前
深度解析RAG系统中的PDF解析模块:Docling集成与并行处理实践
python·算法·pdf
MasonYyp24 分钟前
简单使用Marker
python·语言模型
std860211 小时前
使用 python-docx 和 difflib 对比 Word 文档
python
java1234_小锋1 小时前
TensorFlow2 Python深度学习 - TensorFlow2框架入门 - 使用Keras实现分类问题
python·深度学习·tensorflow·tensorflow2
星期天要睡觉2 小时前
计算机视觉(opencv)——人脸网格关键点检测
python·opencv·计算机视觉
用户8356290780512 小时前
用Python轻松转换Excel表格为HTML格式
后端·python
weixin_307779132 小时前
AWS Redshift 数据仓库完整配置与自动化管理指南
开发语言·数据仓库·python·云计算·aws
Sunsets_Red2 小时前
差分操作正确性证明
java·c语言·c++·python·算法·c#
APIshop2 小时前
代码实例:Python 爬虫抓取与解析 JSON 数据
爬虫·python·json