浅谈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检测远程端口是否打开的方法
Mar 14 Python
Python编程使用NLTK进行自然语言处理详解
Nov 16 Python
Python爬取当当、京东、亚马逊图书信息代码实例
Dec 09 Python
numpy中loadtxt 的用法详解
Aug 03 Python
python使用Plotly绘图工具绘制散点图、线形图
Apr 02 Python
bluepy 一款python封装的BLE利器简单介绍
Jun 25 Python
python matplotlib库直方图绘制详解
Aug 10 Python
python文件操作的简单方法总结
Nov 07 Python
Python django搭建layui提交表单,表格,图标的实例
Nov 18 Python
Python3 全自动更新已安装的模块实现
Jan 06 Python
Python+unittest+requests+excel实现接口自动化测试框架
Dec 23 Python
Django debug为True时,css加载失败的解决方案
Apr 24 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(6) 面向对象
2010/02/16 PHP
php遍历所有文件及文件夹的方法深入解析
2013/06/08 PHP
解析在apache里面给php写虚拟目录的详细方法
2013/06/24 PHP
PHP解析目录路径的3个函数总结
2014/11/18 PHP
thinkPHP5.0框架API优化后的友好性分析
2017/03/17 PHP
PHP读取Excel内的图片(phpspreadsheet和PHPExcel扩展库)
2019/11/19 PHP
javascript代码加载优化方法
2011/01/30 Javascript
常见JS效果之图片减速度滚动实现代码
2011/12/08 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
手机端转盘抽奖代码分享
2015/09/10 Javascript
在Mac OS上安装使用Node.js的项目自动化构建工具Gulp
2016/06/18 Javascript
基于Vue.js实现数字拼图游戏
2016/08/02 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
2016/11/18 Javascript
基于js中的原型(全面讲解)
2017/09/19 Javascript
微信小程序scroll-view组件实现滚动动画
2018/01/31 Javascript
详解Angular系列之变化检测(Change Detection)
2018/02/26 Javascript
vue2.0 computed 计算list循环后累加值的实例
2018/03/07 Javascript
nodejs实现解析xml字符串为对象的方法示例
2018/03/14 NodeJs
vue弹窗插件实战代码
2018/09/08 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
[02:22]《新闻直播间》2017年08月14日
2017/08/15 DOTA
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python执行CMD指令,并获取返回的方法
2018/12/19 Python
django celery redis使用具体实践
2019/04/08 Python
Python搭建HTTP服务过程图解
2019/12/14 Python
scrapy头部修改的方法详解
2020/12/06 Python
屈臣氏俄罗斯在线商店:Watsons俄罗斯
2020/08/03 全球购物
英国最大的天然和有机产品在线零售商之一:Big Green Smile
2020/05/06 全球购物
普通PHP程序员笔试题
2016/01/01 面试题
专科毕业生自我鉴定
2013/12/01 职场文书
研修第一天随笔感言
2014/02/15 职场文书
中华魂演讲稿
2014/05/13 职场文书
港澳通行证委托书怎么写
2014/08/02 职场文书
个人房屋买卖协议书(范本)
2014/10/04 职场文书
Java中的继承、多态以及封装
2022/04/11 Java/Android
win10更新失败无限重启解决方法
2022/04/19 数码科技