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求两个文本文件以行为单位的交集、并集与差集的方法
Jun 17 Python
实例讲解Python编程中@property装饰器的用法
Jun 20 Python
win7上python2.7连接mysql数据库的方法
Jan 14 Python
Python实现统计文本文件字数的方法
May 05 Python
python清理子进程机制剖析
Nov 23 Python
Python递归实现汉诺塔算法示例
Mar 19 Python
使用sklearn之LabelEncoder将Label标准化的方法
Jul 11 Python
详解python实现识别手写MNIST数字集的程序
Aug 03 Python
Windows系统Python直接调用C++ DLL的方法
Aug 01 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
Apr 22 Python
三步解决python PermissionError: [WinError 5]拒绝访问的情况
Apr 22 Python
python 第三方库paramiko的常用方式
Feb 20 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
UTF8编码内的繁简转换的PHP类
2009/07/09 PHP
将文件夹压缩成zip文件的php代码
2009/12/14 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
2015/07/09 PHP
Mac系统下搭建Nginx+php-fpm实例讲解
2020/12/15 PHP
jquery实现居中弹出层代码
2010/08/25 Javascript
Javascript自定义排序 node运行 实例
2013/06/05 Javascript
js history对象简单实现返回和前进
2013/10/30 Javascript
js获得参数的getParameter使用示例
2014/02/26 Javascript
JavaScript中使用Object.create()创建对象介绍
2014/12/30 Javascript
jQuery prototype冲突的2种解决方法(附demo示例下载)
2016/01/21 Javascript
如何提高javascript加载速度
2016/12/26 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
详解vue数组遍历方法forEach和map的原理解析和实际应用
2018/11/15 Javascript
如何用JavaScript实现功能齐全的单链表详解
2019/02/11 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
2019/05/12 Javascript
解决layer弹出层中表单不起作用的问题
2019/09/09 Javascript
JS实现滑动导航效果
2020/01/14 Javascript
在Python中处理字符串之isdecimal()方法的使用
2015/05/20 Python
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
pycharm重置设置,恢复默认设置的方法
2018/10/22 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
2019/12/12 Python
pycharm 关闭search everywhere的解决操作
2021/01/15 Python
HTML块级标签汇总(小篇)
2016/07/13 HTML / CSS
美国滑雪和滑雪板商店:Buckman
2018/03/03 全球购物
Fanatics英国官网:美国体育电商
2018/11/06 全球购物
粗加工管理制度
2014/02/04 职场文书
工作态度检讨书
2014/02/11 职场文书
高中生的自我评价
2014/03/04 职场文书
网络编辑岗位职责
2014/03/18 职场文书
大学学生个人总结
2015/02/15 职场文书
2015大学迎新标语
2015/07/16 职场文书
小学副班长竞选稿
2015/11/21 职场文书
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL
Python 中的单分派泛函数你真的了解吗
2021/06/22 Python
【海涛dota解说】DCG联赛第一周 LGD VS DH
2022/04/01 DOTA