浅谈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的ORM框架中SQLAlchemy库的查询操作的教程
Apr 25 Python
深入理解Python中装饰器的用法
Jun 28 Python
浅谈编码,解码,乱码的问题
Dec 30 Python
利用numpy实现一、二维数组的拼接简单代码示例
Dec 15 Python
简单实现python收发邮件功能
Jan 05 Python
快速了解python leveldb
Jan 18 Python
django Admin文档生成器使用详解
Jul 22 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
Dec 02 Python
Python.append()与Python.expand()用法详解
Dec 18 Python
Python hmac模块使用实例解析
Dec 24 Python
python 字典item与iteritems的区别详解
Apr 25 Python
python中time.ctime()实例用法
Feb 03 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
Smarty模板快速入门
2007/01/04 PHP
PHP文件注释标记及规范小结
2012/04/01 PHP
php curl基本操作详解
2013/07/23 PHP
PHP使用curl_multi实现并发请求的方法示例
2018/04/29 PHP
Javascript 实用小技巧
2010/04/07 Javascript
添加JavaScript重载函数的辅助方法2
2010/07/04 Javascript
JavaScript中switch判断容易犯错的一个细节
2014/08/27 Javascript
jQuery实现的登录浮动框效果代码
2015/09/26 Javascript
老生常谈JavaScript 正则表达式语法
2016/08/20 Javascript
JavaScript实现解析INI文件内容的方法
2016/11/17 Javascript
浅析javaScript中的浅拷贝和深拷贝
2017/02/15 Javascript
基于Bootstrap框架实现图片切换
2017/03/10 Javascript
angular2+nodejs实现图片上传功能
2017/03/27 NodeJs
详解AngularJS 路由 resolve用法
2017/04/24 Javascript
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
2017/11/27 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
2018/01/03 Javascript
VUE v-for循环中每个item节点动态绑定不同函数的实例
2018/09/26 Javascript
nodejs log4js 使用详解
2019/05/31 NodeJs
详解Vue.js中引入图片路径的几种方式
2019/06/17 Javascript
python模拟登录百度贴吧(百度贴吧登录)实例
2013/12/18 Python
Python编写生成验证码的脚本的教程
2015/05/04 Python
Python利用turtle库绘制彩虹代码示例
2017/12/20 Python
python并发2之使用asyncio处理并发
2017/12/21 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
2018/10/28 Python
Python图像处理PIL各模块详细介绍(推荐)
2019/07/17 Python
纯CSS3代码实现switch滑动开关按钮效果
2016/08/30 HTML / CSS
详解CSS3选择器:nth-child和:nth-of-type之间的差异
2017/09/18 HTML / CSS
国际旅客访问北美最大的汽车租赁提供商:Alamo Rent A Car
2018/06/13 全球购物
师范应届生教师求职信
2013/11/05 职场文书
金属材料工程个人求职的自我评价
2013/12/04 职场文书
承办会议欢迎词
2014/01/17 职场文书
上班离岗检讨书
2014/01/27 职场文书
2014年班级工作总结
2014/11/14 职场文书
报案材料怎么写
2015/05/25 职场文书
django如何自定义manage.py管理命令
2021/04/27 Python
为什么你写的height:100%不起作用
2021/05/10 HTML / CSS