深入理解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中使用PyHook监听鼠标和键盘事件实例
Jul 18 Python
安装ElasticSearch搜索工具并配置Python驱动的方法
Dec 22 Python
给你选择Python语言实现机器学习算法的三大理由
Nov 15 Python
浅析Python四种数据类型
Sep 26 Python
对python中的iter()函数与next()函数详解
Oct 18 Python
python 去除二维数组/二维列表中的重复行方法
Jan 23 Python
浅析Python 读取图像文件的性能对比
Mar 07 Python
实例详解Python装饰器与闭包
Jul 29 Python
基于torch.where和布尔索引的速度比较
Jan 02 Python
python把一个字符串切开的实例方法
Sep 27 Python
python基础入门之字典和集合
Jun 13 Python
Python tensorflow卷积神经Inception V3网络结构
May 06 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
Linux环境下搭建php开发环境的操作步骤
2013/06/17 PHP
解析smarty模板中类似for的功能实现
2013/06/18 PHP
PHP 转义使用详解
2013/07/15 PHP
php生成rss类用法实例
2015/04/14 PHP
PHP实现的蚂蚁爬杆路径算法代码
2015/12/03 PHP
Laravel 错误提示本地化的实现
2019/10/22 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
jquery DOM操作 基于命令改变页面
2010/05/06 Javascript
Chrome Form多次提交表单问题的解决方法
2011/05/09 Javascript
让你的博客飘雪花超出屏幕依然看得见
2013/01/04 Javascript
解析ScrollPic在ie8下只滚动一遍,然后变为空白 ie6,ie7,chrome,firefox正常
2013/06/26 Javascript
如何动态的导入js文件具体该怎么实现
2014/01/14 Javascript
30分钟快速掌握Bootstrap框架
2016/05/24 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
2016/05/25 Javascript
JavaScript与java语言有什么不同
2016/09/22 Javascript
详解VUE 数组更新
2017/12/16 Javascript
如何以Angular的姿势打开Font-Awesome详解
2018/04/22 Javascript
Vue传参一箩筐(页面、组件)
2019/04/04 Javascript
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
2020/01/16 Javascript
[04:11]DOTA2上海特级锦标赛主赛事首日TOP10
2016/03/03 DOTA
python的描述符(descriptor)、装饰器(property)造成的一个无限递归问题分享
2014/07/09 Python
python如何实现反向迭代
2018/03/20 Python
python pandas实现excel转为html格式的方法
2018/10/23 Python
python批量处理文件或文件夹
2020/07/28 Python
解决Tensorflow占用GPU显存问题
2020/02/03 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
在HTML5 canvas里用卷积核进行图像处理的方法
2018/05/02 HTML / CSS
世界上最大的售后摩托车零配件超市:J&P Cycles
2017/12/08 全球购物
如何执行一个shell程序
2012/11/23 面试题
军训感想500字
2014/02/20 职场文书
环保倡议书300字
2014/05/15 职场文书
政治学求职信
2014/06/03 职场文书
我的中国梦演讲稿400字
2014/08/19 职场文书
Spring Boot实现文件上传下载
2022/08/14 Java/Android