深入理解python中的浅拷贝和深拷贝


Posted in Python onMay 30, 2016

在讲什么是深浅拷贝之前,我们先来看这样一个现象:

a = ['scolia', 123, [], ]
b = a[:]
b[2].append(666)
print a
print b

深入理解python中的浅拷贝和深拷贝

为什么我只对b进行修改,却影响到了a呢?看过我在之前的文章中就说过:序列中保存的都是内存的引用。

深入理解python中的浅拷贝和深拷贝

所以,当我们通过b去修改里面的空列表的时候,其实就是修改内存中的同一个对象,所以会影响到a。

a = ['scolia', 123, [], ]
b = a[:]
print id(a), id(a[0]), id(a[1]), id(a[2])
print id(b), id(b[0]), id(b[1]), id(b[2])

深入理解python中的浅拷贝和深拷贝

代码验证无误,所以虽然a和b是两个不同的对象,但是里面的引用都是一样的。这就是所谓新的对象,旧的内容。

但是,浅拷贝还不仅如此,看下面:

a = ['scolia', 123, [], ]
b = a[:]
b[1] = 666
print a
print b

深入理解python中的浅拷贝和深拷贝

这又是怎么回事呢?

看过我在python变量赋值说明的同学会知道:对于字符串、数字等不可变的数据类型,修改就相当于重新赋值。在这里就相当于刷新引用。

深入理解python中的浅拷贝和深拷贝

代码验证一下:

a = ['scolia', 123, [], ]
b = a[:]
b[1] = 666
print id(a), id(a[0]), id(a[1]), id(a[2])
print id(b), id(b[0]), id(b[1]), id(b[2])

深入理解python中的浅拷贝和深拷贝

看来是正确的。

上面讲的这些就是浅拷贝,总结起来,浅拷贝只是拷贝了一系列引用,当我们在拷贝出来的对象对可修改的数据类型进行修改的时候,并没有改变引用,所以会影响原对象。而对不可修改的对象进行修改的是,则是新建了对象,刷新了引用,所以和原对象的引用不同,结果也就不同。

创建浅拷贝的方法:

1.切片操作

2.使用list()工厂函数新建对象。( b = list(a) )

那么深拷贝不就是将里面引用的对象重新创建了一遍并生成了一个新的一系列引用。

基本上是这样的,但是对于字符串、数字等不可修改的对象来说,重新创建一份似乎有点浪费内存,反正你到时要修改的时候都是新建对象,刷新引用的。所以还用原来的引用也无所谓,还能达到节省内存的目的。

深入理解python中的浅拷贝和深拷贝

看下代码验证:

from copy import deepcopy
a = ['scolia', 123, [], ]
b = deepcopy(a)
b[1] = 666
print id(a), id(a[0]), id(a[1]), id(a[2])
print id(b), id(b[0]), id(b[1]), id(b[2])

深入理解python中的浅拷贝和深拷贝

验证正确。

深拷贝的创建:

1.正如代码示例用一样,只能通过内置的copy模块的deepcopy()方法创建。

好了,关于深浅拷贝的问题就先说到这里,有什么错误或需要补充的以后会继续。

以上这篇深入理解python中的浅拷贝和深拷贝就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 专题二 条件语句和循环语句的基础知识
Mar 19 Python
利用 python 对目录下的文件进行过滤删除
Dec 27 Python
使用pandas的DataFrame的plot方法绘制图像的实例
May 24 Python
python绘制地震散点图
Jun 18 Python
如何使用Python自动控制windows桌面
Jul 11 Python
将python2.7添加进64位系统的注册表方式
Nov 20 Python
python飞机大战pygame游戏背景设计详解
Dec 17 Python
python matplotlib中的subplot函数使用详解
Jan 19 Python
python爬虫构建代理ip池抓取数据库的示例代码
Sep 22 Python
Matlab如何实现矩阵复制扩充
Jun 02 Python
Python+腾讯云服务器实现每日自动健康打卡
Dec 06 Python
Python利用Turtle绘制哆啦A梦和小猪佩奇
Apr 04 Python
浅谈Python的文件类型
May 30 #Python
python中string模块各属性以及函数的用法介绍
May 30 #Python
Python 常用string函数详解
May 30 #Python
整理Python 常用string函数(收藏)
May 30 #Python
深入浅析python继承问题
May 29 #Python
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
May 28 #Python
python自动翻译实现方法
May 28 #Python
You might like
摩卡咖啡
2021/03/03 咖啡文化
php is_file 判断给定文件名是否为一个正常的文件
2010/05/10 PHP
php导出excel格式数据问题
2014/03/11 PHP
laravel 出现command not found问题的解决方案
2019/10/23 PHP
jquery的相对父元素和相对文档定位示例代码
2013/08/02 Javascript
Javascript 修改String 对象 增加去除空格功能(示例代码)
2013/11/30 Javascript
js简单的弹出框有关闭按钮
2014/05/05 Javascript
JavaScript实现的一个计算数字步数的算法分享
2014/12/06 Javascript
jquery手风琴特效插件
2015/02/04 Javascript
jquery获取复选框checkbox的值的简单实现方法
2016/05/26 Javascript
JavaScript函数表达式详解及实例
2017/05/05 Javascript
Vue.js弹出模态框组件开发的示例代码
2017/07/26 Javascript
Vue-Quill-Editor富文本编辑器的使用教程
2018/09/21 Javascript
jquery.param()实现数组或对象的序列化方法
2018/10/08 jQuery
深入理解Angularjs 脏值检测
2018/10/12 Javascript
electron制作仿制qq聊天界面的示例代码
2018/11/26 Javascript
详解Vue中使用插槽(slot)、聚类插槽
2019/04/12 Javascript
vue项目如何监听localStorage或sessionStorage的变化
2021/01/04 Vue.js
[03:55]TI9战队采访——TNC Predator
2019/08/22 DOTA
python正则表达式之作业计算器
2016/03/18 Python
Python+Turtle动态绘制一棵树实例分享
2018/01/16 Python
深入理解python中sort()与sorted()的区别
2018/08/29 Python
python实现列表的排序方法分享
2019/07/01 Python
python实现的分析并统计nginx日志数据功能示例
2019/12/21 Python
Python StringIO如何在内存中读写str
2020/01/07 Python
波兰化妆品和护肤品购物网站:eKobieca
2019/08/30 全球购物
劳动竞赛活动总结
2014/05/05 职场文书
文秘应届生求职信
2014/07/05 职场文书
2014银行领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
2014乡镇干部对照检查材料思想汇报
2014/09/26 职场文书
公司离职证明标准格式
2014/11/18 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
长江七号观后感
2015/06/11 职场文书
详细了解MVC+proxy
2021/07/09 Java/Android
详解如何使用Nginx解决跨域问题
2022/05/06 Servers
python如何查找列表中元素的位置
2022/05/30 Python