深入理解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中的集合类型知识讲解
Aug 19 Python
Python简单实现安全开关文件的两种方式
Sep 19 Python
python安装cx_Oracle模块常见问题与解决方法
Feb 21 Python
Python学习入门之区块链详解
Jul 25 Python
详解 Python 与文件对象共事的实例
Sep 11 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
Sep 11 Python
python将处理好的图像保存到指定目录下的方法
Jan 10 Python
Python子类继承父类构造函数详解
Feb 19 Python
python3获取url文件大小示例代码
Sep 18 Python
pandas数据处理进阶详解
Oct 11 Python
python实现输入任意一个大写字母生成金字塔的示例
Oct 27 Python
tensorflow 模型权重导出实例
Jan 24 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数据结构 算法(PHP描述) 简单选择排序 simple selection sort
2011/08/09 PHP
使用PHP求两个文件的相对路径
2013/06/20 PHP
解决php表单重复提交实现方法
2015/09/29 PHP
解决Laravel 使用insert插入数据,字段created_at为0000的问题
2019/10/11 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
一个用js实现控制台控件的代码
2007/09/04 Javascript
AeroWindow 基于JQuery的弹出窗口插件
2011/06/27 Javascript
js点击页面其它地方将某个显示的DIV隐藏
2012/07/12 Javascript
如何用ajax来创建一个XMLHttpRequest对象
2012/12/10 Javascript
深入理解javascript动态插入技术
2013/11/12 Javascript
详解JavaScript对象序列化
2016/01/19 Javascript
jQuery插件 Jqplot图表实例
2016/06/18 Javascript
jQuery 获取页面li数组并删除不在数组中的key
2016/08/02 Javascript
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
2017/06/04 Javascript
解决LayUI表单获取不到data的问题
2018/08/20 Javascript
vue自定义全局共用函数详解
2018/09/18 Javascript
layui使用数据表格实现购物车功能
2019/07/26 Javascript
[03:05]《我与DAC》之xiao8:DAC与BG
2018/03/27 DOTA
Python序列操作之进阶篇
2016/12/08 Python
使用Python对SQLite数据库操作
2017/04/06 Python
Python连接SQLServer2000的方法详解
2017/04/19 Python
对Python进行数据分析_关于Package的安装问题
2017/05/22 Python
python爬虫_实现校园网自动重连脚本的教程
2018/04/22 Python
Python读取mat文件,并转为csv文件的实例
2018/07/04 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
Python CVXOPT模块安装及使用解析
2019/08/01 Python
Python 列表推导式需要注意的地方
2020/10/23 Python
阿迪达斯丹麦官网:adidas丹麦
2016/10/01 全球购物
美国大城市最热门旅游景点门票:CityPASS
2016/12/16 全球购物
UML设计模式笔试题
2014/06/07 面试题
大学生个人求职信
2014/06/02 职场文书
服务行业演讲稿
2014/09/02 职场文书
社区环境卫生倡议书
2015/04/29 职场文书
Python中for后接else的语法使用
2021/05/18 Python
python 判断文件或文件夹是否存在
2022/03/18 Python
如何Python使用re模块实现okenizer
2022/04/30 Python