深入理解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 变量类型及命名规则介绍
Jun 08 Python
Python按行读取文件的简单实现方法
Jun 22 Python
一道python走迷宫算法题
Jan 22 Python
python编程测试电脑开启最大线程数实例代码
Feb 09 Python
对python sklearn one-hot编码详解
Jul 10 Python
python 执行终端/控制台命令的例子
Jul 12 Python
python  ceiling divide 除法向上取整(或小数向上取整)的实例
Dec 27 Python
python实现图像拼接
Mar 05 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
Jun 28 Python
教你如何用python操作摄像头以及对视频流的处理
Oct 12 Python
java字符串格式化输出实例讲解
Jan 06 Python
OpenCV-Python直方图均衡化实现图像去雾
Jun 07 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 使用header函数设置HTTP头的示例解析 表头
2013/06/17 PHP
php 批量添加多行文本框textarea一行一个
2014/06/03 PHP
php一个解析字符串排列数组的方法
2015/05/12 PHP
php实现仿写CodeIgniter的购物车类
2015/07/29 PHP
PHP7新特性foreach 修改示例介绍
2016/08/26 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
2019/05/14 PHP
JS时间选择器 兼容IE6,7,8,9
2012/06/26 Javascript
js实现从数组里随机获取元素
2015/01/12 Javascript
JavaScript里四舍五入函数round用法实例
2015/04/06 Javascript
使用jQuery在对象中缓存选择器的简单方法
2015/06/30 Javascript
JavaScript实现Fly Bird小游戏
2016/12/15 Javascript
理解AngularJs篇:30分钟快速掌握AngularJs
2016/12/23 Javascript
jquery精度计算代码 jquery指定精确小数位
2017/02/06 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
elementui之el-tebs浏览器卡死的问题和使用报错未注册问题
2019/07/06 Javascript
基于Echarts图表在div动态切换时不显示的解决方式
2020/07/20 Javascript
使用Element的InfiniteScroll 无限滚动组件报错的解决
2020/07/27 Javascript
解决await在forEach中不起作用的问题
2021/02/25 Javascript
[01:09:40]Newbee vs Pain 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
详解C++编程中一元运算符的重载
2016/01/19 Python
python中numpy包使用教程之数组和相关操作详解
2017/07/30 Python
Python 逐行分割大txt文件的方法
2017/10/10 Python
Python遍历numpy数组的实例
2018/04/04 Python
python用插值法绘制平滑曲线
2021/02/19 Python
Pytorch在NLP中的简单应用详解
2020/01/08 Python
tensorflow下的图片标准化函数per_image_standardization用法
2020/06/30 Python
Django实现随机图形验证码的示例
2020/10/15 Python
HTML5表格_动力节点Java学院整理
2017/07/11 HTML / CSS
HTML5边玩边学(3)像素和颜色
2010/09/21 HTML / CSS
敏捷开发的主要原则都有哪些
2015/04/26 面试题
五心教育心得体会
2014/09/04 职场文书
乡镇遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
舞蹈社团活动总结
2015/05/07 职场文书
行政答辩状范文
2015/05/21 职场文书
物业公司管理制度
2015/08/05 职场文书
关于redisson缓存序列化几枚大坑说明
2021/08/04 Redis