深入理解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中的getopt函数使用详解
Jul 28 Python
Python3操作SQL Server数据库(实例讲解)
Oct 21 Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
Dec 15 Python
Python 记录日志的灵活性和可配置性介绍
Feb 27 Python
使用PyCharm创建Django项目及基本配置详解
Oct 24 Python
解决python 无法加载downsample模型的问题
Oct 25 Python
Python图像处理库PIL的ImageDraw模块介绍详解
Feb 26 Python
如何在sublime编辑器中安装python
May 20 Python
python能开发游戏吗
Jun 11 Python
python和php哪个更适合写爬虫
Jun 22 Python
Python日志打印里logging.getLogger源码分析详解
Jan 17 Python
Pandas实现批量拆分与合并Excel的示例代码
May 30 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.ini save_handler 修改不生效的解决办法
2014/07/22 PHP
PHP+APACHE实现网址伪静态
2015/02/22 PHP
php实现通过cookie换肤的方法
2015/07/13 PHP
php对二维数组进行相关操作(排序、转换、去空白等)
2015/11/04 PHP
微信网页授权(OAuth2.0) PHP 源码简单实现
2016/08/29 PHP
PHP基于SimpleXML生成和解析xml的方法示例
2017/07/17 PHP
JS 继承实例分析
2008/11/04 Javascript
jQuery实现的图片轮播效果完整示例
2016/09/12 Javascript
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
vue.js实现数据动态响应 Vue.set的简单应用
2017/06/15 Javascript
想用好React的你必须要知道的一些事情
2017/07/24 Javascript
JS实现获取word文档内容并输出显示到html页面示例
2018/06/23 Javascript
jQuery实现购物车的总价计算和总价传值功能
2018/11/28 jQuery
[原创]微信小程序获取网络类型的方法示例
2019/03/01 Javascript
Vue-cli3项目引入Typescript的实现方法
2019/10/18 Javascript
Vue.js组件props数据验证实现详解
2019/10/19 Javascript
javascript实现电商放大镜效果
2020/11/23 Javascript
python通过urllib2获取带有中文参数url内容的方法
2015/03/13 Python
python下MySQLdb用法实例分析
2015/06/08 Python
python读取TXT到数组及列表去重后按原来顺序排序的方法
2015/06/26 Python
Python之使用adb shell命令启动应用的方法详解
2019/01/07 Python
在django中,关于session的通用设置方法
2019/08/06 Python
Python Gitlab Api 使用方法
2019/08/28 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
为什么要用EJB
2014/04/17 面试题
如何用Python来进行查询和替换一个文本字符串
2014/01/02 面试题
留学自荐信的技巧
2013/10/17 职场文书
总经理文秘岗位职责
2014/02/03 职场文书
网站创业计划书
2014/04/30 职场文书
装配出错检讨书
2014/09/23 职场文书
群众路线四风对照检查材料
2014/11/04 职场文书
先进个人材料怎么写
2014/12/30 职场文书
学校办公室主任岗位职责
2015/04/01 职场文书
2015年安全员工作总结范文
2015/04/22 职场文书
如何让2019年上半年的工作总结更出色!
2019/07/01 职场文书
中秋节英文祝福语句(14句)
2019/09/11 职场文书