浅谈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的SimPy库简化复杂的编程模型的介绍
Apr 13 Python
用Python编写脚本使IE实现代理上网的教程
Apr 23 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
Oct 11 Python
python密码错误三次锁定(实例讲解)
Nov 14 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
Jan 10 Python
Python 互换字典的键值对实例
Feb 12 Python
Python selenium根据class定位页面元素的方法
Feb 26 Python
python rsync服务器之间文件夹同步脚本
Aug 29 Python
python使用PIL和matplotlib获取图片像素点并合并解析
Sep 10 Python
Python可以用来做什么
Nov 23 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
Dec 18 Python
Python实现DBSCAN聚类算法并样例测试
Jun 22 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
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
2013/06/25 PHP
开源php中文分词系统SCWS安装和使用实例
2014/04/11 PHP
ThinkPHP标签制作教程
2014/07/10 PHP
PHP 表单提交及处理表单数据详解及实例
2016/12/27 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
2017/02/25 PHP
Laravel中任务调度console使用方法小结
2017/05/07 PHP
php生出随机字符串
2017/07/06 PHP
laravel框架实现后台登录、退出功能示例
2019/10/31 PHP
刷新时清空文本框内容的js代码
2007/04/23 Javascript
JavaScript.The.Good.Parts阅读笔记(一)假值与===运算符
2010/11/16 Javascript
javascript 节点排序 2
2011/01/31 Javascript
javascript设置连续两次点击按钮时间间隔的方法
2014/10/28 Javascript
让angularjs支持浏览器自动填表
2014/11/10 Javascript
jQuery on()方法使用技巧详解
2015/04/16 Javascript
javascript父子页面通讯实例详解
2015/07/17 Javascript
jQuery实现简单下拉导航效果
2015/09/07 Javascript
JavaScript手机振动API
2016/06/11 Javascript
javascript比较语义化版本号的实现代码
2016/09/09 Javascript
JavaScript字符串对象
2017/01/14 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
vue时间格式化实例代码
2017/06/13 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
python实现微信远程控制电脑
2018/02/22 Python
Python 3.7新功能之dataclass装饰器详解
2018/04/21 Python
对python操作kafka写入json数据的简单demo分享
2018/12/27 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
python实现Pyecharts实现动态地图(Map、Geo)
2020/03/25 Python
Python应用自动化部署工具Fabric原理及使用解析
2020/11/30 Python
CSS3 伪类选择器 nth-child()说明
2010/07/10 HTML / CSS
css3的transition属性详解
2014/12/15 HTML / CSS
《黄山奇石》教学反思
2014/04/19 职场文书
Python中的xlrd模块使用整理
2021/06/15 Python
Python标准库pathlib操作目录和文件
2021/11/20 Python
MYSQL事务的隔离级别与MVCC
2022/05/25 MySQL