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

相关推荐
星空的资源小屋8 分钟前
Text Grab,一款OCR 截图文字识别工具
python·django·ocr·scikit-learn
寒秋丶10 分钟前
Milvus:Json字段详解(十)
数据库·人工智能·python·ai·milvus·向量数据库·rag
自由随风飘4 小时前
python 题目练习1~5
开发语言·python
fl1768316 小时前
基于python的天气预报系统设计和可视化数据分析源码+报告
开发语言·python·数据分析
闲人编程7 小时前
Python与区块链:如何用Web3.py与以太坊交互
python·安全·区块链·web3.py·以太坊·codecapsule
Want5957 小时前
Python汤姆猫
开发语言·python
花姐夫Jun8 小时前
基于Vue+Python+Orange Pi Zero3的完整视频监控方案
vue.js·python·音视频
像风一样自由20209 小时前
Rust与Python完全指南:从零开始理解两门语言的区别与关系
开发语言·python·rust
房开民9 小时前
RKNN-Toolkit2入门
python