浅谈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学习资料
Feb 08 Python
Python中用字符串调用函数或方法示例代码
Aug 04 Python
Python实现的破解字符串找茬游戏算法示例
Sep 25 Python
全面了解Nginx, WSGI, Flask之间的关系
Jan 09 Python
python操作oracle的完整教程分享
Jan 30 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
Sep 04 Python
python logging日志模块原理及操作解析
Oct 12 Python
Spring Cloud Feign高级应用实例详解
Dec 10 Python
tensorflow 只恢复部分模型参数的实例
Jan 06 Python
Python生成器实现简单"生产者消费者"模型代码实例
Mar 27 Python
Python上下文管理器Content Manager
Jun 26 Python
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
Apr 11 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学习笔记 PHP面向对象的程序设计
2011/06/13 PHP
数组与类使用PHP的可变变量名需要的注意的问题
2013/06/20 PHP
php等比例缩放图片及剪切图片代码分享
2016/02/13 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
2016/04/21 PHP
深入聊聊Array的sort方法的使用技巧.详细点评protype.js中的sortBy方法
2007/04/12 Javascript
Mootools 1.2教程(21)——类(二)
2009/09/15 Javascript
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
jquery+json实现数据列表分页示例代码
2013/11/15 Javascript
setTimeout()递归调用不加引号出错的解决方法
2014/09/05 Javascript
JQuery右键菜单插件ContextMenu使用指南
2014/12/19 Javascript
微信小程序 获取设备信息 API实例详解
2016/10/02 Javascript
JavaScript验证知识整理
2017/03/24 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
vue 中filter的多种用法
2018/04/26 Javascript
jQuery实现动画、消失、显现、渐出、渐入效果示例
2018/09/06 jQuery
小程序开发中如何使用async-await并封装公共异步请求的方法
2019/01/20 Javascript
如何将百度地图包装成Vue的组件的方法步骤
2019/02/12 Javascript
axios实现文件上传并获取进度
2020/03/25 Javascript
layui数据表格 table.render 报错的解决方法
2019/09/29 Javascript
详解vue高级特性
2020/06/09 Javascript
python生成IP段的方法
2015/07/07 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
2018/04/02 Python
python 使用plt画图,去除图片四周的白边方法
2019/07/09 Python
Python shelve模块实现解析
2019/08/28 Python
Python运行DLL文件的方法
2020/01/17 Python
Python基础之字符串常见操作经典实例详解
2020/02/26 Python
Max&Co官网:意大利年轻女性时尚品牌
2017/05/16 全球购物
世界上最大的铁人三项商店:Tri UK
2020/11/04 全球购物
餐饮业会计岗位职责
2013/12/19 职场文书
授权委托书格式模板
2014/04/03 职场文书
创建绿色社区汇报材料
2014/08/22 职场文书
社区学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
公司文体活动总结
2015/05/07 职场文书
Pycharm 如何设置HTML文件自动补全代码或标签
2021/05/21 Python
Redis高并发缓存架构性能优化
2022/05/15 Redis