浅谈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的Flask框架及Nginx实现静态文件访问限制功能
Jun 27 Python
python利用正则表达式搜索单词示例代码
Sep 24 Python
Django使用Celery异步任务队列的使用
Mar 13 Python
python将文本中的空格替换为换行的方法
Mar 19 Python
Python基于pandas实现json格式转换成dataframe的方法
Jun 22 Python
python 使用re.search()筛选后 选取部分结果的方法
Nov 28 Python
Python3.5集合及其常见运算实例详解
May 01 Python
使用Python Pandas处理亿级数据的方法
Jun 24 Python
python NumPy ndarray二维数组 按照行列求平均实例
Nov 26 Python
使用Matplotlib 绘制精美的数学图形例子
Dec 13 Python
Python通过zookeeper实现分布式服务代码解析
Jul 22 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
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/29 PHP
php判断文件上传类型及过滤不安全数据的方法
2014/12/17 PHP
php绘制一条弧线的方法
2015/01/24 PHP
PHP标准类(stdclass)用法示例
2016/09/28 PHP
jquery ajax提交表单数据的两种实现方法
2010/04/29 Javascript
jQuery实现悬浮在右上角的网页客服效果代码
2015/10/24 Javascript
跟我学习javascript的prototype使用注意事项
2015/11/17 Javascript
Bootstrap按钮组件详解
2016/04/26 Javascript
jquery+ajax实现直接提交表单实例分析
2016/06/17 Javascript
javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)
2016/09/20 Javascript
NodeJS测试框架mocha入门教程
2017/03/28 NodeJs
关于jQuery.ajax()的jsonp碰上post详解
2017/07/02 jQuery
vue生成随机验证码的示例代码
2017/09/29 Javascript
VUE-Table上绑定Input通过render实现双向绑定数据的示例
2018/08/27 Javascript
axios+Vue实现上传文件显示进度功能
2019/04/14 Javascript
[46:42]DOTA2-DPC中国联赛正赛 Aster vs Magma BO3 第二场 3月5日
2021/03/11 DOTA
Python中的文件和目录操作实现代码
2011/03/13 Python
在Python中操作文件之seek()方法的使用教程
2015/05/24 Python
python基础知识小结之集合
2015/11/25 Python
Python实现的桶排序算法示例
2017/11/29 Python
python 公共方法汇总解析
2019/09/16 Python
python3 tcp的粘包现象和解决办法解析
2019/12/09 Python
python中shell执行知识点
2020/05/06 Python
CSS3的常见transformation图形变化用法小结
2016/05/13 HTML / CSS
HTML5实现一个能够移动的小坦克示例代码
2013/09/02 HTML / CSS
ProBikeKit美国官网:自行车套件,跑步和铁人三项套件
2016/10/13 全球购物
95%的面试官都会问到的50道Java线程题,附答案
2012/08/03 面试题
双十佳事迹材料
2014/01/29 职场文书
国际政治学专业推荐信
2014/09/26 职场文书
大学生档案自我鉴定(2篇)
2014/10/14 职场文书
六年级语文下册教学计划
2015/01/22 职场文书
幼儿园开学家长寄语(2015秋季)
2015/05/27 职场文书
开业庆典嘉宾致辞
2015/08/01 职场文书
PySwarms(Python粒子群优化工具包)的使用:GlobalBestPSO例子解析
2021/04/05 Python
《巫师》是美食游戏?CDPR10月将推出《巫师》官方食谱
2022/04/03 其他游戏
vue项目如何打包之项目打包优化(让打包的js文件变小)
2022/04/30 Vue.js