浅谈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正则表达式判断字符串是否是全部小写示例
Dec 25 Python
详解在Python程序中解析并修改XML内容的方法
Nov 16 Python
Python入门_学会创建并调用函数的方法
May 16 Python
Python利用turtle库绘制彩虹代码示例
Dec 20 Python
Django中STATIC_ROOT和STATIC_URL及STATICFILES_DIRS浅析
May 08 Python
快速解决docker-py api版本不兼容的问题
Aug 30 Python
Python实现的爬取豆瓣电影信息功能案例
Sep 15 Python
Python实现FLV视频拼接功能
Jan 21 Python
python实现在线翻译
Jun 18 Python
python中xlrd模块的使用详解
Feb 01 Python
浅谈python数据类型及其操作
May 25 Python
python代码实现备忘录案例讲解
Jul 26 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 VS ASP
2006/10/09 PHP
PHP 柱状图实现代码
2009/12/04 PHP
PHP中auto_prepend_file与auto_append_file用法实例分析
2014/09/22 PHP
PHP模糊查询技术实例分析【附源码下载】
2019/03/07 PHP
php数组遍历类与用法示例
2019/05/24 PHP
javascript dom代码应用 简单的相册[firefox only]
2010/06/12 Javascript
IE6下focus与blur错乱的解决方案
2011/07/31 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
JavaScript制作颜色反转小游戏
2016/09/25 Javascript
AngularJS指令用法详解
2016/11/02 Javascript
如何提高Dom访问速度
2017/01/05 Javascript
React Js 微信禁止复制链接分享禁止隐藏右上角菜单功能
2017/05/26 Javascript
vue.js移动端app实战1:初始配置详解
2017/07/24 Javascript
jQuery选择器之属性筛选选择器用法详解
2017/09/19 jQuery
五步轻松实现JavaScript HTML时钟效果
2020/03/25 Javascript
详解Angular调试技巧之报错404(not found)
2018/01/31 Javascript
详解从买域名到使用pm2部署node.js项目全过程
2018/03/07 Javascript
vscode中vue-cli项目es-lint的配置方法
2018/07/30 Javascript
如何实现一个webpack模块解析器
2018/10/24 Javascript
vue组件开发之tab切换组件使用详解
2020/08/21 Javascript
vue中路由跳转不计入history的操作
2020/09/21 Javascript
[02:38]DOTA2英雄基础教程 噬魂鬼
2014/01/03 DOTA
Python读取图片为16进制表示简单代码
2018/01/19 Python
浅谈django url请求与数据库连接池的共享问题
2019/08/29 Python
Python request使用方法及问题总结
2020/04/26 Python
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
HTML5 LocalStorage 本地存储详细概括(多图)
2017/08/18 HTML / CSS
Gap工厂店:Gap Factory
2017/11/02 全球购物
国际旅客访问北美最大的汽车租赁提供商:Alamo Rent A Car
2018/06/13 全球购物
日语专业推荐信
2013/11/12 职场文书
实习协议书范本
2014/04/22 职场文书
人代会简报
2015/07/21 职场文书
基于Python实现的购物商城管理系统
2021/04/27 Python
python flask开发的简单基金查询工具
2021/06/02 Python
MySQL实例精讲单行函数以及字符数学日期流程控制
2021/10/15 MySQL
OpenFeign实现远程调用
2022/08/14 Java/Android