浅谈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 相关文章推荐
PHP webshell检查工具 python实现代码
Sep 15 Python
使用Python神器对付12306变态验证码
Jan 05 Python
Python实现全角半角字符互转的方法
Nov 28 Python
django的settings中设置中文支持的实现
Apr 28 Python
Django+zTree构建组织架构树的方法
Aug 21 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
Oct 30 Python
Python enumerate内置库用法解析
Feb 24 Python
python+selenium+PhantomJS抓取网页动态加载内容
Feb 25 Python
Python PyQt5模块实现窗口GUI界面代码实例
May 12 Python
Python中的全局变量如何理解
Jun 04 Python
Django3中的自定义用户模型实例详解
Aug 23 Python
Django 用户认证Auth组件的使用
Nov 30 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版(5)
2006/10/09 PHP
CI框架中redis缓存相关操作文件示例代码
2016/05/17 PHP
PHP 并发场景的几种解决方案
2019/06/14 PHP
Laravel框架实现抢红包功能示例
2019/10/31 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
JQuery 绑定事件时传递参数的实现方法
2009/10/13 Javascript
php读取sqlite数据库入门实例代码
2014/06/25 Javascript
浅谈Javascript中的Function与Object
2015/01/26 Javascript
js与jquery实时监听输入框值的oninput与onpropertychange方法
2015/02/05 Javascript
学习Bootstrap滚动监听 附调用方法
2016/07/02 Javascript
vue-router命名路由和编程式路由传参讲解
2019/01/19 Javascript
vue-cli3环境变量与分环境打包的方法示例
2019/02/18 Javascript
js最实用string(字符串)类型的使用及截取与拼接详解
2019/04/26 Javascript
vue 保留两位小数 不能直接用toFixed(2) 的解决
2020/08/07 Javascript
vue3.0 上手体验
2020/09/21 Javascript
[01:38]DOTA2辉夜杯 欢乐的观众现场采访
2015/12/26 DOTA
Python中的赋值、浅拷贝、深拷贝介绍
2015/03/09 Python
Python进程间通信之共享内存详解
2017/10/30 Python
python提取具有某种特定字符串的行数据方法
2018/12/11 Python
python标识符命名规范原理解析
2020/01/10 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
2020/01/24 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
2020/02/03 Python
2020新版本pycharm+anaconda+opencv+pyqt环境配置学习笔记,亲测可用
2020/03/24 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
python复合条件下的字典排序
2020/12/18 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
上海中网科技笔试题
2012/02/19 面试题
linux面试题参考答案(4)
2013/01/28 面试题
应届生法律顾问求职信
2013/11/19 职场文书
财务管理专业自荐信范文
2013/12/24 职场文书
求职信范文大全
2014/05/26 职场文书
生日宴会策划方案
2014/06/03 职场文书
国际贸易本科毕业生求职信
2014/09/26 职场文书
关于成立领导小组的通知
2015/04/23 职场文书
公务员保密工作承诺书
2015/05/04 职场文书