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操作列表之List.insert()方法的使用
May 20 Python
在Linux命令行终端中使用python的简单方法(推荐)
Jan 23 Python
详解python基础之while循环及if判断
Aug 24 Python
Python爬虫实例扒取2345天气预报
Mar 04 Python
pandas进行数据的交集与并集方式的数据合并方法
Jun 27 Python
Python过滤txt文件内重复内容的方法
Oct 21 Python
Python求两个圆的交点坐标或三个圆的交点坐标方法
Nov 07 Python
pycharm 将python文件打包为exe格式的方法
Jan 16 Python
详解python:time模块用法
Mar 25 Python
python 实现的发送邮件模板【普通邮件、带附件、带图片邮件】
Jul 06 Python
详解Python文件修改的两种方式
Aug 22 Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
Feb 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
地摊中国 - 珍藏老照片
2020/08/18 杂记
Wordpress php 分页代码
2009/10/21 PHP
php中取得文件的后缀名?
2012/02/20 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
2016/10/13 PHP
经常用到的JavasScript事件的翻译
2007/04/09 Javascript
javascript 用原型继承来实现对象系统
2010/03/22 Javascript
基于jquery的跨域调用文件
2010/11/19 Javascript
jQuery中:header选择器用法实例
2014/12/29 Javascript
JS实现超炫网页烟花动画效果的方法
2015/03/02 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
2015/12/08 Javascript
功能强大的Bootstrap组件(结合js)
2016/08/03 Javascript
jQuery实现的自定义滚动条实例详解
2016/09/20 Javascript
简单谈谈JS数组中的indexOf方法
2016/10/13 Javascript
js文件中直接alert()中文出来的是乱码的解决方法
2016/11/01 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
2017/12/22 Javascript
vue强制刷新组件的方法示例
2019/02/28 Javascript
ES6知识点整理之对象解构赋值应用示例
2019/04/17 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
2019/09/20 Javascript
vue实现打地鼠小游戏
2020/08/21 Javascript
js 函数性能比较方法
2020/08/24 Javascript
Python程序设计入门(1)基本语法简介
2014/06/13 Python
Python爬取数据并写入MySQL数据库的实例
2018/06/21 Python
Python实现base64编码的图片保存到本地功能示例
2018/06/22 Python
使用Python读取二进制文件的实例讲解
2018/07/09 Python
python用fsolve、leastsq对非线性方程组求解
2018/12/15 Python
iPython pylab模式启动方式
2020/04/24 Python
Python中如何添加自定义模块
2020/06/09 Python
Python闭包装饰器使用方法汇总
2020/06/29 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
2020/12/21 Python
Django视图类型总结
2021/02/17 Python
美国领先的商务贺卡出版商:The Gallery Collection
2018/02/13 全球购物
Myprotein芬兰官网:欧洲第一运动营养品牌
2019/05/05 全球购物
涪陵白鹤梁导游词
2015/02/09 职场文书
大学生自我鉴定怎么写
2019/05/07 职场文书
C站最全Python标准库总结,你想要的都在这里
2021/07/03 Python