Python中浅拷贝和深拷贝的区别总结与理解
单层浅拷贝
import copy
a = 1 # 不可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 内存地址相同
a = [1,2] # 可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 内存地址不相同
单层深拷贝
import copy
a = 1 # 不可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 内存地址相同
a = [1,2] # 可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 内存地址不相同
结论一:
不管深拷贝还是浅拷贝对不可变数据类型都是引用内存地址
不管深拷贝还是浅拷贝对可变数据类型都是会重新创建新的内存空间
浅拷贝嵌套
# -----------不可变数据类型---------
# 情况一,内嵌可变数据类型
import copy
a = ([1,2],(3,4)) # 不可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 内存地址相同
# 情况二,内嵌不可变数据类型
a = ((1,2),(3,4)) # 不可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 内存地址相同
#-----------可变数据类型-------------
# 情况一,内嵌可变数据类型
import copy
a = [(1,2),[3,4]] # 可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 内存地址不相同
# 情况一, 可变数据类型 内嵌可变数据类型
import copy
a = [(1,2),(3,4)] # 可变数据类型
copy_a = copy.copy(a)
print(id(a),id(copy_a)) # 内存地址不相同
深拷贝嵌套
# -----------不可变数据类型---------
# 情况一,内嵌可变数据类型
import copy
a = ([1,2],(3,4)) # 不可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 内存地址不相同
# 情况二,内嵌不可变数据类型
a = ((1,2),(3,4)) # 不可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 内存地址相同
#-----------可变数据类型-------------
# 情况一,内嵌可变数据类型
import copy
a = [(1,2),[3,4]] # 可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 内存地址不相同
print(id(a[0]),id(copy_a[0])) # 内存地址相同
print(id(a[1]),id(copy_a[1])) # 内存地址不相同
# 情况一, 可变数据类型 内嵌可变数据类型
import copy
a = [(1,2),(3,4)] # 可变数据类型
copy_a = copy.deepcopy(a)
print(id(a),id(copy_a)) # 内存地址不相同
print(id(a[0]),id(copy_a[0])) # 内存地址相同
结论二:
浅拷贝:
- 外层是不可变类型、不管内层是否可变都是引用拷贝
- 外层是可变类型,不管内层是否可变都会从新创建新的内存空间
深拷贝:
- 外层是不可变类型,会递归判断内层数据类型、如果可变则创建新的内存地址、都为不可变就是引用拷贝
- 外层是可变数据类型、不管内层是否可变都会创新新的内存地址、但是内部如果为可变则递归创建、不可变则为引用地址
总结:
浅拷贝:
- 浅拷贝只做最顶层的数据类型判断
- 如果顶层是可变类型则创建新的内存空间
- 如果顶层是不可变数据类型就是引用拷贝
深拷贝:
- 深拷贝做递归拷贝,可以递归拷贝所有的内部嵌套数据(可以理解为循环遍历做浅拷贝判断)
- 深拷贝递归拷贝遇到可变类型则创建新的内存空间
- 深拷贝递归拷贝遇到不可变数据类型就是拷贝的引用
Python中浅拷贝和深拷贝的区别总结与理解的更多相关文章
- python中浅拷贝和深拷贝的区别
浅拷贝 可变类型浅拷贝copy函数就是浅拷贝,只对可变类型的第一层对象进行拷贝,对拷贝的对象开辟新的内存空间进行存储,不会拷贝对象内部的子对象可变类型:a = [1, 2, 3] b = [11, 2 ...
- JavaScript中浅拷贝和深拷贝的区别和实现
深拷贝和浅拷贝的区别 浅拷贝(shallow copy):只复制指向某个对象的指针,而不复制对象本身,新旧对象共享一块内存: 深拷贝(deep copy):复制并创建一个一摸一样的对象,不共 ...
- Java中浅拷贝和深拷贝的区别
浅拷贝和深拷贝的定义: 浅拷贝: 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.即对象的浅拷贝会对"主"对象进行拷贝,但不会复制主对象 ...
- python中浅拷贝和深拷贝分析
首先,我们知道Python3中,有6个标准的数据类型,他们又分为可以变和不可变.不可变:Number(数字).String(字符串).Tuple(元组).可以变:List(列表).Dictionary ...
- JavaScript中浅拷贝和深拷贝的区别
JavaScript数据类型 基础数据类型:保存在栈内存中的简单数据段 ,有undefined,boolean,number,string,null 引用数据类型:Array,object,Funct ...
- python中赋值,深拷贝,浅拷贝区别
这三种 的区别就是 复制的变量 是否是原变量的引用. 赋值:只是原变量的引用. 浅拷贝和深拷贝的区别 需要通过 子元素 区分 浅拷贝:子元素的 引用相同 深拷贝:所以引用都不相同,完全复制一份 这三种 ...
- Python FAQ2:赋值、浅拷贝、深拷贝的区别?
在Python编程过程中,经常会遇到对象的拷贝,如果不理解浅拷贝和深拷贝的概念,你的代码就可能出现一些问题.所以,在这里按个人的理解谈谈它们之间的区别. 一.赋值(assignment) 在<P ...
- 深度解析:python之浅拷贝与深拷贝
深度解析python之浅拷贝与深拷贝 本文包括知识点: 1.copy与deepcopy 2.可变类型与不可变类型 1.copy与deepcopy 在日常python编码过程中,经常会遇见变量的赋值.这 ...
- C++浅拷贝和深拷贝的区别
C++浅拷贝和深拷贝的区别 2012-04-24 21:22 11454人阅读 评论(6) 收藏 举报 c++deleteclass编译器c c++默认的拷贝构造函数是浅拷贝 浅拷贝就是对象的数据成员 ...
随机推荐
- [Hive_1] Hive 基本概念
Hive 系列01 Hive 简介 & Hive 应用场景 & Hive 与 Hadoop 的关系 & Hive 与传统数据库对比 1. Hive 简介 [ 官方介绍 ] Ap ...
- mysql数据库中导入txt文本数据的方法
安装好MySQL和Navicat 8 for MySQL 通过Navicat 8 for MySQL创建数据库test. 2 在数据库test上创建测试数据表student(主键ID,姓名,年龄,学 ...
- Qt: QAction在QToolBar中快捷键行为注意事项
在QMenuBar中添加快捷键很简单,只要在text的特定字母前加&,如&k按下ALT+k即会触发(QPushButton也是一样).但在QToolBar则不然,需要调action-& ...
- python3: 数字日期和时间(2)
12.基本的日期与时间转换 Q: 你需要执行简单的时间转换,比如天到秒,小时到分钟等的转换 A: 为了执行不同时间单位的转换和计算,请使用 datetime 模块. 比如,为了表示一个时间段,可以创建 ...
- JFreeChart绘制XY折线图(工具类设计)
准备用Java写通信的仿真平台作为毕业设计,相比matlab绘图,Java绘图需要自己去写很多工具类,博主在这采用了JFreeChart的开源解决方案,摸索着自己写了一个XY折线图工具类,话不多说贴源 ...
- 死磕nginx系列--nginx服务器做web服务器
nginx 做静态服务器 HTML页面如下 <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- nginx静态文件缓存的解决方案
nginx的一大功能就是完成静态资源的分离部署,减轻后端服务器的压力,如果给这些静态资源再加一级nginx的缓存,可以进一步提升访问效率. 第一步:添加nginx.conf的http级别的缓存配置 # ...
- js基础知识入门总结
1.第一个js程序 一个项目包括三部分:前端(html.css.js).数据库.后端技术 引入方式:页面中直接写,script标签引入 js事件绑定: <input type="but ...
- 609E- Minimum spanning tree for each edge
Connected undirected weighted graph without self-loops and multiple edges is given. Graph contains n ...
- Python3.2-re模块之常用正则记录
python的re模块是个很好的模块,这里简单记录下自己编写的几个有用的正则: 1:邮箱匹配: gReMailbox = re.compile(r'([\w\.\-+]+@[\w\-]+(?:\.[\ ...