Python中的深拷贝和浅拷贝详解


Posted in Python onJune 03, 2015

要说清楚Python中的深浅拷贝,需要搞清楚下面一系列概念:
变量-引用-对象(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝)

【变量-对象-引用】

在Python中一切都是对象,比如说:3, 3.14, 'Hello', [1,2,3,4],{'a':1}......

Python中的深拷贝和浅拷贝详解

甚至连type其本身都是对象,type对象
Python中变量与C/C++/Java中不同,它是指对象的引用,Python是动态类型,程序运行时候,会根据对象的类型
来确认变量到底是什么类型。

单独赋值: 比如说:

>>> a = 3

在运行a=3后,变量a变成了对象3的一个引用。在内部,变量事实上是到对象内存空间的一个指针

Python中的深拷贝和浅拷贝详解

因为Python的变量不过是对象的引用,或指向对象的指针,因此在程序中可以经常改变变量引用

>>> x = 42      #变量绑定到整型对象

>>> x = 'Hello' #现在又成了字符串

>>> x = [1,2,3] #现在又成了列表

专业表述如下:

变量是一个系统表的元素,拥有指向对象的连接的空间
对象是被分配的一块内存,存储其所代表的值
引用是自动形成的从变量到对象的指针
特别注意: 类型属于对象,不是变量
比如像刚才的a=3, 整数对象3包含了两重信息
1.值为3
2.一个头部信息:告诉Pthyon,这是个整数对象[相当于一个指向int的指针]

共享引用: 比如说:

>>> a = 3

>>> b = a

在运行赋值语句b = a之后,变量a和变量b指向了同一个对象的内存空间.

Python中的深拷贝和浅拷贝详解

Python中的深拷贝和浅拷贝详解

从上图可以看到,a和b,其id完全一样,指向同一个整数对象3,或者说同一块内存

Python中的深拷贝和浅拷贝详解

如果删掉a后, 不会影响b

Python中的深拷贝和浅拷贝详解

拷贝概念的引入就是针对:可变对象的共享引用潜在的副作用而提出的.
【可变对象-不可变对象】
在Python中不可变对象指:一旦创建就不可修改的对象,包括字符串,元祖,数字
在Python中可变对象是指:可以修改的对象,包括:列表、字典
上面说的a,b都是整数,整数是不可变对象,如果是可变对象的话,就是另外一回事了。

>>> L1 = [2,3,4]      #L1变量指向的是一个可变对象:列表  

>>> L2 = L1           #将L1值赋给L2后,两者共享引用同一个列表对象[1,2,3,4]  

>>> L1[0] = 200       #因为列表可变,改变L1中第一个元素的值  

>>> L1; L2            #改变后,L1,L2同时改变,因为对象本身值变了  

[200, 3, 4]  

[200, 3, 4] 

如果不想改变列表L2的值,有两种方法:切片 和 copy模块
>>> L1 = [2,3,4]   

>>> L2 = L1  

>>> id(L1);id(L2)     #共享引用一个可变对象  

45811784L  

45811784L  

>>> L2 = L1[:]        #切片操作  

>>> id(L1);id(L2)     #切片后,对象就不一样了  

45811784L  

45806920L  

>>> L1[0] = 200  

>>> L1;L2             #L1发生改变,L2没有变化  

[200, 3, 4]  

[2,   3, 4] 

【拷贝】
1. 切片技术应用于所有的序列,包括:列表、字符串、元祖
   >>>但切片不能应用于字典。对字典只能使用D.copy()方法或D.deepcopy()方法.

Python中的深拷贝和浅拷贝详解

2. 深浅拷贝,即可用于序列,也可用于字典

   >>> import copy

   >>> X = copy.copy(Y)      #浅拷贝:只拷贝顶级的对象,或者说:父级对象

   >>> X = copy.deepcopy(Y)  #深拷贝:拷贝所有对象,顶级对象及其嵌套对象。或者说:父级对象及其子对象

如果字典只有顶级对象:

Python中的深拷贝和浅拷贝详解

如果字典中嵌套对象:

Python中的深拷贝和浅拷贝详解

【结论】

深浅拷贝都是对源对象的复制,占用不同的内存空间
如果源对象只有一级目录的话,源做任何改动,不影响深浅拷贝对象
如果源对象不止一级目录的话,源做任何改动,都要影响浅拷贝,但不影响深拷贝
序列对象的切片其实是浅拷贝,即只拷贝顶级的对象

Python 相关文章推荐
Python 制作糗事百科爬虫实例
Sep 22 Python
Python实现多线程HTTP下载器示例
Feb 11 Python
批量获取及验证HTTP代理的Python脚本
Apr 23 Python
python使用mysql的两种使用方式
Mar 07 Python
Python3多线程操作简单示例
May 22 Python
python批量修改图片大小的方法
Jul 24 Python
python opencv实现切变换 不裁减图片
Jul 26 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
Jun 21 Python
pytorch 实现删除tensor中的指定行列
Jan 13 Python
Python模块_PyLibTiff读取tif文件的实例
Jan 13 Python
python用opencv完成图像分割并进行目标物的提取
May 25 Python
使用pytorch实现论文中的unet网络
Jun 24 Python
python下paramiko模块实现ssh连接登录Linux服务器
Jun 03 #Python
python处理二进制数据的方法
Jun 03 #Python
Python读写配置文件的方法
Jun 03 #Python
python操作ssh实现服务器日志下载的方法
Jun 03 #Python
Python实现建立SSH连接的方法
Jun 03 #Python
解密Python中的描述符(descriptor)
Jun 03 #Python
python实用代码片段收集贴
Jun 03 #Python
You might like
php上传文件并存储到mysql数据库的方法
2015/03/16 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
2015/09/25 PHP
变量在 PHP7 内部的实现(一)
2015/12/21 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
使用Rancher在K8S上部署高性能PHP应用程序的教程
2020/07/10 PHP
top.location.href 没有权限 解决方法
2008/08/05 Javascript
两种WEB下的模态对话框 (asp.net或js的分别实现)
2009/12/02 Javascript
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
JSON传递bool类型数据的处理方式介绍
2013/09/18 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 图片库
2015/01/09 Javascript
jQuery on()方法使用技巧详解
2015/04/16 Javascript
js实现获取当前时间是本月第几周的方法
2015/08/11 Javascript
nodejs加密Crypto的实例代码
2016/07/07 NodeJs
vue.js 1.x与2.0中js实时监听input值的变化
2017/03/15 Javascript
Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)
2017/05/09 Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
2017/09/25 Javascript
Vue2.0学习之详解Vue 组件及父子组件通信
2017/12/12 Javascript
[47:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[00:18]天涯墨客三技能展示
2018/08/25 DOTA
Python操作Mysql实例代码教程在线版(查询手册)
2013/02/18 Python
Python的Flask框架中配置多个子域名的方法讲解
2016/06/07 Python
python先序遍历二叉树问题
2017/11/10 Python
python中实现字符串翻转的方法
2018/07/11 Python
Python设计模式之模板方法模式实例详解
2019/01/17 Python
python打开windows应用程序的实例
2019/06/28 Python
CSS3媒体查询Media Queries基础学习教程
2016/02/29 HTML / CSS
Lancer Skincare官方网站:抗衰老皮肤护理
2020/11/20 全球购物
酷瑞网络科技面试题
2012/03/30 面试题
linux面试题参考答案(7)
2012/10/29 面试题
史上最全面的Java面试题汇总!
2015/02/03 面试题
学生干部学习的自我评价
2014/02/18 职场文书
班组长竞聘书
2014/03/31 职场文书
工作推荐信范文
2014/05/10 职场文书
2014党员干部四风问题对照检查材料思想汇报
2014/09/24 职场文书
2015年检验科工作总结
2015/04/27 职场文书
最美劳动诗,致敬所有的劳动者!
2019/07/12 职场文书