深入理解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中threading模块的几个常用方法
Jun 18 Python
django admin添加数据自动记录user到表中的实现方法
Jan 05 Python
python使用turtle库绘制时钟
Mar 25 Python
Django中日期处理注意事项与自定义时间格式转换详解
Aug 06 Python
Python实现多级目录压缩与解压文件的方法
Sep 01 Python
python从list列表中选出一个数和其对应的坐标方法
Jul 20 Python
Tornado实现多进程/多线程的HTTP服务详解
Jul 25 Python
Flask模板引擎Jinja2使用实例
Apr 23 Python
sqlalchemy实现时间列自动更新教程
Sep 02 Python
python Autopep8实现按PEP8风格自动排版Python代码
Mar 02 Python
ROS系统将python包编译为可执行文件的简单步骤
Jul 25 Python
分享Python异步爬取知乎热榜
Apr 12 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
深入PHP许愿墙模块功能分析
2013/06/25 PHP
php返回相对时间(如:20分钟前,3天前)的方法
2015/04/14 PHP
php常用图片处理类
2016/03/16 PHP
使用Zookeeper分布式部署PHP应用程序
2019/03/15 PHP
javaScript 动态访问JSon元素示例代码
2013/08/30 Javascript
jquery live()重复绑定的解决方法介绍
2014/01/03 Javascript
DOM基础教程之模型中的模型节点
2015/01/19 Javascript
innerHTML中标签可以换行的方法汇总
2015/08/14 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
2016/07/22 Javascript
JS实现用户注册时获取短信验证码和倒计时功能
2016/10/27 Javascript
Vue2 模板template的四种写法总结
2018/02/23 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
详解vuex 渐进式教程实例代码
2018/11/27 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
[51:34]Ti4主赛事胜者组 DK vs EG 2
2014/07/19 DOTA
[55:04]海涛DOTA2死魂复燃6.82版本介绍
2014/09/28 DOTA
python实现封装得到virustotal扫描结果
2014/10/05 Python
Centos部署django服务nginx+uwsgi的方法
2019/01/02 Python
python可视化实现KNN算法
2019/10/16 Python
python爬虫开发之selenium模块详细使用方法与实例全解
2020/03/09 Python
解决Tensorflow2.0 tf.keras.Model.load_weights() 报错处理问题
2020/06/12 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
2020/10/15 Python
Python修改DBF文件指定列
2020/12/19 Python
CSS3实现大小不一的粒子旋转加载动画
2016/04/21 HTML / CSS
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
经济管理专业自荐信
2013/12/30 职场文书
拾金不昧表扬信范文
2014/01/11 职场文书
实习生岗位职责
2014/04/12 职场文书
保护黄河倡议书
2014/05/16 职场文书
化工专业自荐书
2014/06/16 职场文书
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
教师党员批评与自我批评发言稿
2014/10/15 职场文书
2014年学习委员工作总结
2014/11/14 职场文书
2015年乡镇卫生院妇幼保健工作总结
2015/05/19 职场文书
小学英语教学反思范文
2016/02/15 职场文书