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利用装饰器进行运算的实例分析
Aug 04 Python
Python的爬虫包Beautiful Soup中用正则表达式来搜索
Jan 20 Python
快速排序的算法思想及Python版快速排序的实现示例
Jul 02 Python
django 修改server端口号的方法
May 14 Python
Django框架HttpRequest对象用法实例分析
Nov 01 Python
python Manager 之dict KeyError问题的解决
Dec 21 Python
Python统计时间内的并发数代码实例
Dec 28 Python
基于Python计算圆周率pi代码实例
Mar 25 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
Jun 15 Python
如何以Winsows Service方式运行JupyterLab
Aug 30 Python
细说NumPy数组的四种乘法的使用
Dec 18 Python
聊聊Python String型列表求最值的问题
Jan 18 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
echo(),print(),print_r()之间的区别?
2006/11/19 PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
2013/06/18 PHP
php简单的留言板与回复功能具体实现
2014/02/19 PHP
什么是PHP7中的孤儿进程与僵尸进程
2019/04/14 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
2012/07/21 Javascript
js加入收藏以及使用Jquery更改透明度
2014/01/26 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
返回顶部按钮响应滚动且动态显示与隐藏
2014/10/14 Javascript
JS实现Select的option上下移动的方法
2016/03/01 Javascript
js数组与字符串常用方法总结
2017/01/13 Javascript
jQuery模拟下拉框选择对应菜单的内容
2017/03/07 Javascript
详解vue-cli项目中怎么使用mock数据
2018/05/29 Javascript
小程序云开发实战小结
2018/10/25 Javascript
微信小程序实现的一键复制功能示例
2019/04/24 Javascript
详解微信小程序入门从这里出发(登录注册、开发工具、文件及结构介绍)
2020/07/21 Javascript
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
python两种遍历字典(dict)的方法比较
2014/05/29 Python
python中as用法实例分析
2015/04/30 Python
解决Tensorflow使用pip安装后没有model目录的问题
2018/06/13 Python
对Tensorflow中权值和feature map的可视化详解
2018/06/14 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
python实现简单学生信息管理系统
2020/04/09 Python
J2EE是技术还是平台还是框架
2016/08/14 面试题
求职者应聘的自我评价
2013/10/16 职场文书
公司部门司机岗位职责
2014/01/03 职场文书
学期研究性学习个人的自我评价
2014/01/09 职场文书
创业计划书撰写原则
2014/01/25 职场文书
年度考核自我鉴定
2014/02/02 职场文书
事务机电主管工作职责
2014/02/25 职场文书
学校综治宣传月活动总结
2014/07/02 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书
golang 实现菜单树的生成方式
2021/04/28 Golang
Python实现简单的俄罗斯方块游戏
2021/09/25 Python
「我的青春恋爱物语果然有问题。-妄言录-」第20卷封面公开
2022/03/21 日漫