浅谈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快速查找算法应用实例
Sep 26 Python
初学Python函数的笔记整理
Apr 07 Python
Python中for循环控制语句用法实例
Jun 02 Python
Python数据分析库pandas基本操作方法
Apr 08 Python
python判断计算机是否有网络连接的实例
Dec 15 Python
Tensorflow模型实现预测或识别单张图片
Jul 19 Python
python各类经纬度转换的实例代码
Aug 08 Python
python滑块验证码的破解实现
Nov 10 Python
Python3操作YAML文件格式方法解析
Apr 10 Python
Jupyter 无法下载文件夹如何实现曲线救国
Apr 22 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
Jul 02 Python
Python numpy矩阵处理运算工具用法汇总
Jul 13 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
非常不错的MySQL优化的8条经验
2008/03/24 PHP
PHP中PDO基础教程 入门级
2011/09/04 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
JS字符串处理实例代码
2013/08/05 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
javascript鼠标滑过显示二级菜单特效
2020/11/18 Javascript
nodejs如何获取时间戳与时间差
2016/08/03 NodeJs
清除js缓存的多种方法总结
2016/12/09 Javascript
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
Linux系统中利用node.js提取Word(doc/docx)及PDF文本的内容
2017/06/17 Javascript
angular-tree-component的使用详解
2018/07/30 Javascript
微信小程序文章详情页面实现代码
2018/09/10 Javascript
重命名批处理python脚本
2013/04/05 Python
Python中使用摄像头实现简单的延时摄影技术
2015/03/27 Python
在Python下利用OpenCV来旋转图像的教程
2015/04/16 Python
在Ubuntu系统下安装使用Python的GUI工具wxPython
2016/02/18 Python
python 矩阵增加一行或一列的实例
2018/04/04 Python
删除python pandas.DataFrame 的多重index实例
2018/06/08 Python
django 类视图的使用方法详解
2019/07/24 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
2020/07/03 Python
使用CSS3来匹配横屏竖屏的简单方法
2015/08/04 HTML / CSS
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
纽约海:Sea New York
2018/11/04 全球购物
西班牙Polo衫品牌:Polo Club
2020/08/09 全球购物
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
物流管理应届生求职信
2013/11/07 职场文书
大专生的学习自我评价
2013/12/04 职场文书
广告学专业自荐信范文
2014/02/24 职场文书
就业意向书
2014/07/29 职场文书
村主任“四风”问题个人整改措施
2014/10/04 职场文书
幼儿园老师新年寄语2015
2014/12/08 职场文书
2015年母亲节寄语
2015/03/23 职场文书
《猴王出世》教学反思
2016/02/23 职场文书
为什么中国式养孩子很累?
2019/08/07 职场文书
python生成可执行exe控制Microsip自动填写号码并拨打功能
2021/06/21 Python