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

相关推荐
540_5402 分钟前
ADVANCE Day41
人工智能·python·深度学习
0思必得018 分钟前
[Web自动化] BeautifulSoup导航文档树
前端·python·自动化·html·beautifulsoup
vyuvyucd22 分钟前
Python条件与循环语句全解析
python
gf132111129 分钟前
制作卡点视频
数据库·python·音视频
owlion32 分钟前
如何将视频文案整理成学习笔记
人工智能·python·机器学习·语言模型·自然语言处理
癫狂的兔子33 分钟前
【Python】【NumPy】random.rand和random.uniform的异同点
开发语言·python·numpy
Lupino38 分钟前
aio_periodic 重构与优化实战:构建高性能 Python 定时任务客户端
python·haskell
先做个垃圾出来………42 分钟前
Python整数存储与位运算
开发语言·python
RAY_010443 分钟前
Python—面向对象
python
才不做选择1 小时前
基于 YOLOv8 的部落冲突 (Clash of Clans) 目标检测系统
人工智能·python·yolo·目标检测