深入理解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 26进制计算实现方法
May 28 Python
python监控linux内存并写入mongodb(推荐)
Sep 11 Python
python 类对象和实例对象动态添加方法(分享)
Dec 31 Python
Python实现简易版的Web服务器(推荐)
Jan 29 Python
对pandas中Series的map函数详解
Jul 25 Python
python使用matplotlib画饼状图
Sep 25 Python
pandas数据集的端到端处理
Feb 18 Python
Python检查图片是否损坏及图片类型是否正确过程详解
Sep 30 Python
使用Python完成15位18位身份证的互转功能
Nov 06 Python
python Canny边缘检测算法的实现
Apr 24 Python
Opencv python 图片生成视频的方法示例
Nov 18 Python
Pandas的数据过滤实现
Jan 15 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
基于数据库的在线人数,日访问量等统计
2006/10/09 PHP
对Session和Cookie的区分与解释
2007/03/16 PHP
在Mac OS的PHP环境下安装配置MemCache的全过程解析
2016/02/15 PHP
yii2控制器Controller Ajax操作示例
2016/07/23 PHP
PHP获取数组中单列值的方法
2017/06/10 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
2019/02/15 PHP
php回调函数处理数组操作示例
2020/04/13 PHP
PHP tp5中使用原生sql查询代码实例
2020/10/28 PHP
javascript操作JSON的要领总结
2012/12/09 Javascript
JSON.parse()和JSON.stringify()使用介绍
2014/06/20 Javascript
JavaScript中连接操作Oracle数据库实例
2015/04/02 Javascript
jQuery实现首页图片淡入淡出效果的方法
2015/06/10 Javascript
基于jQuery实现仿百度首页选项卡切换效果
2016/05/29 Javascript
JSON字符串转换JSONObject和JSONArray的方法
2016/06/03 Javascript
jquery自定义表单验证插件
2016/10/12 Javascript
express文件上传中间件Multer详解
2016/10/24 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
2017/05/17 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
2017/06/26 Javascript
Echarts基本用法_动力节点Java学院整理
2017/08/11 Javascript
layui的数据表格+springmvc实现搜索功能的例子
2019/09/28 Javascript
对pandas replace函数的使用方法小结
2018/05/18 Python
Python实现监控键盘鼠标操作示例【基于pyHook与pythoncom模块】
2018/09/04 Python
python单例模式获取IP代理的方法详解
2018/09/13 Python
关于Python核心框架tornado的异步协程的2种方法详解
2019/08/28 Python
Python通过fnmatch模块实现文件名匹配
2020/09/30 Python
python 检测图片是否有马赛克
2020/12/01 Python
德国柯吉澳趣味家居:Koziol
2017/08/24 全球购物
.NET里面什么时候需要调用垃圾回收
2015/06/01 面试题
node中使用shell脚本的方法步骤
2021/03/23 Javascript
《玩具柜台前的孩子》教学反思
2014/02/13 职场文书
《盘古开天地》教学反思
2014/02/28 职场文书
工程采购员岗位职责
2014/03/09 职场文书
授权委托书格式模板
2014/04/03 职场文书
理想点亮人生演讲稿
2014/05/21 职场文书
2014大学生中国梦主题教育学习思想汇报
2014/09/10 职场文书
高中同学会致辞
2015/08/01 职场文书