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

相关推荐
wow_DG12 小时前
【Python✨】VS Code 秒开 Python 类型检查:一招 mypy + settings.json 让你的 Bug 原地现形!
python·json·bug
Aspect of twilight12 小时前
LeetCode华为大模型岗刷题
python·leetcode·华为·力扣·算法题
空影星12 小时前
高效追踪电脑使用时间,Tockler助你优化时间管理
python·django·flask
LiLiYuan.13 小时前
【Lombok库常用注解】
java·开发语言·python
不去幼儿园13 小时前
【启发式算法】灰狼优化算法(Grey Wolf Optimizer, GWO)详细介绍(Python)
人工智能·python·算法·机器学习·启发式算法
二川bro13 小时前
数据可视化进阶:Python动态图表制作实战
开发语言·python·信息可视化
青青子衿_2114 小时前
TikTok爬取——视频、元数据、一级评论
爬虫·python·selenium
忘却的旋律dw14 小时前
使用LLM模型的tokenizer报错AttributeError: ‘dict‘ object has no attribute ‘model_type‘
人工智能·pytorch·python
20岁30年经验的码农14 小时前
Java RabbitMQ 实战指南
java·开发语言·python
studytosky16 小时前
深度学习理论与实战:MNIST 手写数字分类实战
人工智能·pytorch·python·深度学习·机器学习·分类·matplotlib