浅谈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的Flask框架中web表单的教程
Apr 20 Python
Python2实现的LED大数字显示效果示例
Sep 04 Python
使用python实现knn算法
Dec 20 Python
python数据封装json格式数据
Mar 04 Python
Python基于pycrypto实现的AES加密和解密算法示例
Apr 10 Python
Python 实现文件读写、坐标寻址、查找替换功能
Sep 11 Python
python实现上传文件到linux指定目录的方法
Jan 03 Python
pytorch 获取tensor维度信息示例
Jan 03 Python
python设置环境变量的作用整理
Feb 17 Python
Python读取文件内容为字符串的方法(多种方法详解)
Mar 04 Python
新手学python应该下哪个版本
Jun 11 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
Aug 07 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
PHP5在Apache下的两种模式的安装
2006/09/05 PHP
PHP insert语法详解
2008/06/07 PHP
使用array_map简单搞定PHP删除文件、删除目录
2014/10/29 PHP
JavaScript Math.ceil() 函数使用介绍
2013/12/11 Javascript
node.js中Socket.IO的进阶使用技巧
2014/11/04 Javascript
Nodejs中session的简单使用及通过session实现身份验证的方法
2016/02/04 NodeJs
js获取页面引用的css样式表中的属性值方法(推荐)
2016/08/19 Javascript
微信小程序 轮播图swiper详解及实例(源码下载)
2017/01/11 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
JavaScript 函数的定义-调用、注意事项
2017/04/16 Javascript
深入浅析Vue不同场景下组件间的数据交流
2017/08/15 Javascript
angular实现input输入监听的示例
2018/08/31 Javascript
vue2使用keep-alive缓存多层列表页的方法
2018/09/21 Javascript
python基于phantomjs实现导入图片
2016/05/13 Python
用python与文件进行交互的方法
2018/03/01 Python
python ctypes库2_指定参数类型和返回类型详解
2019/11/19 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
2020/03/04 Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
2020/03/30 Python
详解如何用canvas画一个微笑的表情
2019/03/14 HTML / CSS
极简的HTML5模版
2015/07/09 HTML / CSS
Everything But Water官网:美国泳装品牌
2019/03/17 全球购物
集世界奢侈品和设计师品牌的意大利精品买手店:Tessabit
2019/08/17 全球购物
JBL加拿大官方商店:扬声器、耳机等
2020/10/23 全球购物
JAVA的事件委托机制和垃圾回收机制
2014/09/07 面试题
法律专业自我鉴定
2013/10/03 职场文书
申报职称专业技术个人的自我评价
2013/12/12 职场文书
遥感技术与仪器求职信
2014/02/22 职场文书
领导调研接待方案
2014/02/27 职场文书
购房公证委托书(2014版)
2014/09/12 职场文书
县长群众路线对照检查材料思想汇报
2014/10/02 职场文书
2014年药剂科工作总结
2014/11/26 职场文书
2015元旦家电促销活动策划方案
2014/12/09 职场文书
观后感格式
2015/06/19 职场文书
追悼词范文大全
2015/06/23 职场文书
导游词创作书写原则以及开场白技巧怎么学?
2019/09/25 职场文书
SQL Server删除表中的重复数据
2022/05/25 SQL Server