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轻松查到删除自己的微信好友
Jan 10 Python
python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)
Mar 12 Python
利用python库在局域网内传输文件的方法
Jun 04 Python
python 解决动态的定义变量名,并给其赋值的方法(大数据处理)
Nov 10 Python
Numpy截取指定范围内的数据方法
Nov 14 Python
以SQLite和PySqlite为例来学习Python DB API
Feb 05 Python
在服务器上安装python3.8.2环境的教程详解
Apr 26 Python
linux mint中搜狗输入法导致pycharm卡死的问题
Oct 28 Python
Keras保存模型并载入模型继续训练的实现
Feb 20 Python
python实现web邮箱扫描的示例(附源码)
Mar 30 Python
python中使用 unittest.TestCase单元测试的用例详解
Aug 30 Python
Python matplotlib 利用随机函数生成变化图形
Apr 26 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
使用ThinkPHP的自动完成实现无限级分类实例详解
2016/09/02 PHP
使用composer 安装 laravel框架的方法图文详解
2019/08/02 PHP
详解PHP中curl_multi并发的实现
2020/06/08 PHP
PHP+Mysql分布式事务与解决方案深入理解
2021/02/27 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
JavaScript对象链式操作代码(jquery)
2010/07/04 Javascript
jQuery获取注册信息并提示实现代码
2013/04/21 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
2015/07/28 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
基于javascript bootstrap实现生日日期联动选择
2016/04/07 Javascript
node.js利用redis数据库缓存数据的方法
2017/03/01 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
vue组件实现进度条效果
2018/06/06 Javascript
Vue插件打包与发布的方法示例
2018/08/20 Javascript
vue 中基于html5 drag drap的拖放效果案例分析
2018/11/01 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
基于Vue el-autocomplete 实现类似百度搜索框功能
2019/10/25 Javascript
Element中Slider滑块的具体使用
2020/07/29 Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
2020/11/11 Javascript
Element-ui 自带的两种远程搜索(模糊查询)用法讲解
2021/01/29 Javascript
python 动态获取当前运行的类名和函数名的方法
2014/04/15 Python
对numpy中shape的深入理解
2018/06/15 Python
Python编写合并字典并实现敏感目录的小脚本
2019/02/26 Python
python的json中方法及jsonpath模块用法分析
2019/12/06 Python
Python+OpenCV实现图像的全景拼接
2020/03/05 Python
PyQt5的QWebEngineView使用示例
2020/10/20 Python
顶丰TOPPIK台湾官网:增发纤维假发,告别秃发困扰
2018/06/13 全球购物
物理研修随笔感言
2014/02/14 职场文书
研修第一天随笔感言
2014/02/15 职场文书
外贸采购员岗位职责
2014/03/08 职场文书
借款协议书范本
2014/04/22 职场文书
《蝙蝠和雷达》教学反思
2014/04/23 职场文书
中文专业自荐书
2014/06/29 职场文书
教师竞聘上岗演讲稿
2014/09/03 职场文书
2016年春节慰问信息
2015/03/25 职场文书
党支部工作总结2015
2015/04/01 职场文书