浅谈Python对内存的使用(深浅拷贝)


Posted in Python onJanuary 17, 2018

本文主要研究的是Python对内存的使用(深浅拷贝)的相关问题,具体介绍如下。

浅拷贝就是对引用的拷贝(只拷贝父对象)

深拷贝就是对对象的资源的拷贝

>>> a=[1,2,3,'a','b']
>>> b=a
>>> b
[1, 2, 3, 'a', 'b']
>>> a
[1, 2, 3, 'a', 'b']
>>> id(a)
3021737547592
>>> id(b)
3021737547592
>>> a.append('c')
>>> a
[1, 2, 3, 'a', 'b', 'c']
>>> b
[1, 2, 3, 'a', 'b', 'c']
>>> b.append(4)
>>> b
[1, 2, 3, 'a', 'b', 'c', 4]
>>> a
[1, 2, 3, 'a', 'b', 'c', 4]

从以上操作可以看出:将a赋值给b后,a和b的地址是一样的,无论那个发生变化,另一个都会跟着变化,始终保持相同。

>>> import copy
>>> a=[1,2,3,['a','b','c']]
>>> b=a
>>> c=copy.copy(a)
>>> b
[1, 2, 3, ['a', 'b', 'c']]
>>> c
[1, 2, 3, ['a', 'b', 'c']]
>>> id(a)
3021737548104
>>> id(b)
3021737548104
>>> id(c)
3021737494536    #浅拷贝父对象的地址不一样
>>> a.append('d')
>>> a
[1, 2, 3, ['a', 'b', 'c'], 'd']
>>> b
[1, 2, 3, ['a', 'b', 'c'], 'd']
>>> c
[1, 2, 3, ['a', 'b', 'c']] #a和c的地址不一样,因此a变化,c不变化




>>> id(a[0])
1686357680
>>> id(c[0])
1686357680
>>> id(a[3])
3021737547528
>>> id(c[3])   
3021737547528    #整个父对象所占的空间不一样,但相同的内层数据的所占空间一样
>>> a[3].append('d')
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 'd']
>>> c
[1, 2, 3, ['a', 'b', 'c', 'd']]#因为内层数据所占空间一样,所以a变化,c跟着变化

以上就是浅拷贝:整个父对象的地址不一样,内层数据的地址相同,操作内层数据的话,一同变化;操作对象为父对象时,拷贝对象不跟着变化。

>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 'd']
>>> d=copy.deepcopy(a)
>>> d
[1, 2, 3, ['a', 'b', 'c', 'd'], 'd']
>>> id(a)
3021737548104
>>> id(d)
3021737547656  #深拷贝父对象的地址不一样

>>> a.append('e')
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd'], 'd', 'e']
>>> d
[1, 2, 3, ['a', 'b', 'c', 'd'], 'd']#a和d的地址不一样,因此a变化,d不变化
>>> id(a[0])
1686357680
>>> id(d[0])
1686357680
>>> id(a[3])
3021737547528
>>> id(d[3])
3021737493256  #内层数据的地址不一样
>>> a[3].append('x')
>>> a
[1, 2, 3, ['a', 'b', 'c', 'd', 'x'], 'd', 'e']
>>> d
[1, 2, 3, ['a', 'b', 'c', 'd'], 'd']

以上是深拷贝

区别:

浅拷贝与原对象的内层数据地址相同;
深拷贝完全独立开来,与原对象没有任何联系。

总结

以上就是本文关于浅谈Python对内存的使用(深浅拷贝)的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
Python自动化测试ConfigParser模块读写配置文件
Aug 15 Python
Python实现二维数组输出为图片
Apr 03 Python
python文件拆分与重组实例
Dec 10 Python
CentOS7安装Python3的教程详解
Apr 10 Python
python中利用numpy.array()实现俩个数值列表的对应相加方法
Aug 26 Python
Python实现TCP通信的示例代码
Sep 09 Python
python实现简单日志记录库glog的使用
Dec 13 Python
Tensorflow 卷积的梯度反向传播过程
Feb 10 Python
jupyter notebook中美观显示矩阵实例
Apr 17 Python
详细分析Python collections工具库
Jul 16 Python
python模拟点击玩游戏的实例讲解
Nov 26 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
Feb 25 Python
Python分支结构(switch)操作简介
Jan 17 #Python
python2 与python3的print区别小结
Jan 16 #Python
python正则中最短匹配实现代码
Jan 16 #Python
Python程序员面试题 你必须提前准备!
Jan 16 #Python
详解python使用递归、尾递归、循环三种方式实现斐波那契数列
Jan 16 #Python
Python+tkinter模拟“记住我”自动登录实例代码
Jan 16 #Python
Python利用字典将两个通讯录文本合并为一个文本实例
Jan 16 #Python
You might like
Snoopy类使用小例子
2008/04/15 PHP
PHP 中提示undefined index如何解决(多种方法)
2016/03/16 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
掌握PHP垃圾回收机制详解
2019/03/13 PHP
php写app用的框架整理
2019/09/29 PHP
如果文字过长,则将过长的部分变成省略号显示
2006/06/26 Javascript
用JavaScript获取网页中的js、css、Flash等文件
2006/12/20 Javascript
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
jQuery分别获取选中的复选框值的示例
2014/06/17 Javascript
JavaScript中反正弦函数Math.asin()的使用简介
2015/06/14 Javascript
Angular2学习笔记——详解NgModule模块
2016/12/02 Javascript
self.attachevent is not a function的解决方法
2017/04/04 Javascript
ES6 javascript中class静态方法、属性与实例属性用法示例
2017/10/30 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
2018/12/30 Javascript
详解ES6中的Map与Set集合
2019/03/22 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
vuex actions异步修改状态的实例详解
2019/11/06 Javascript
vue实现表格合并功能
2020/12/01 Vue.js
python映射列表实例分析
2015/01/26 Python
简要讲解Python编程中线程的创建与锁的使用
2016/02/28 Python
使用Python & Flask 实现RESTful Web API的实例
2017/09/19 Python
mac下给python3安装requests库和scrapy库的实例
2018/06/13 Python
Python爬虫抓取技术的一些经验
2019/07/12 Python
django一对多模型以及如何在前端实现详解
2019/07/24 Python
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
家得宝墨西哥官网:The Home Depot墨西哥
2019/11/18 全球购物
几个MySql的面试题
2013/04/22 面试题
会计应聘求职信范文
2013/12/17 职场文书
大二学生学年自我鉴定
2014/09/12 职场文书
大学四年个人总结
2015/03/03 职场文书
银行求职信范文
2019/05/13 职场文书
Oracle 区块链表创建过程详解
2021/05/15 Oracle
详解Redis的三种常用的缓存读写策略步骤
2022/05/06 Redis
vscode内网访问服务器的方法
2022/06/28 Servers
Win11控制面板快捷键是什么?Win11打开控制面板的方法汇总
2022/07/07 数码科技