深入理解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 相关文章推荐
浅谈function(函数)中的动态参数
Apr 30 Python
python分析作业提交情况
Nov 22 Python
Python简单生成随机姓名的方法示例
Dec 27 Python
python实现猜单词小游戏
May 22 Python
win7下python3.6安装配置方法图文教程
Jul 31 Python
linux查找当前python解释器的位置方法
Feb 20 Python
python装饰器简介---这一篇也许就够了(推荐)
Apr 01 Python
python判断所输入的任意一个正整数是否为素数的两种方法
Jun 27 Python
浅谈在JupyterNotebook下导入自己的模块的问题
Apr 16 Python
使用keras实现densenet和Xception的模型融合
May 23 Python
python使用yaml 管理selenium元素的示例
Dec 01 Python
windows系统Tensorflow2.x简单安装记录(图文)
Jan 18 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面向对象全攻略 (五) 封装性
2009/09/30 PHP
Sorting Array Values in PHP(数组排序)
2011/09/15 PHP
PHP set_error_handler()函数使用详解(示例)
2013/11/12 PHP
PHP中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
php构造函数的继承方法
2015/02/09 PHP
PHP实现上传多文件示例代码
2017/02/20 PHP
PHP实现网站访问量计数器
2017/10/27 PHP
Laravel 模型使用软删除-左连接查询-表起别名示例
2019/10/24 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
javascript new一个对象的实质
2010/01/07 Javascript
JavaScript 类的定义和引用 JavaScript高级培训 自定义对象
2010/04/27 Javascript
js下拉菜单语言选项简单实现
2013/09/23 Javascript
JavaScript显示当然日期和时间即年月日星期和时间
2013/10/29 Javascript
jQuery Mobile 导航栏代码
2013/11/01 Javascript
JavaScript中合并数组的N种方法
2014/09/16 Javascript
JSON取值前判断
2014/12/23 Javascript
js实现简单鼠标跟随效果的方法
2015/04/10 Javascript
Javascript中的 “&” 和 “|” 详解
2017/02/02 Javascript
详解ElementUI之表单验证、数据绑定、路由跳转
2017/06/21 Javascript
js案例之鼠标跟随jquery版(实例讲解)
2017/07/21 jQuery
js实现3D旋转相册
2020/08/02 Javascript
Vue封装Axios请求和拦截器的步骤
2020/09/16 Javascript
Python比较两个图片相似度的方法
2015/03/13 Python
Windows下PyMongo下载及安装教程
2015/04/27 Python
python urllib urlopen()对象方法/代理的补充说明
2017/06/29 Python
由面试题加深对Django的认识理解
2019/07/19 Python
Python连接SQLite数据库并进行增册改查操作方法详解
2020/02/18 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
Python正则表达式高级使用方法汇总
2020/06/18 Python
Pycharm快捷键配置详细整理
2020/10/13 Python
你应该知道的30个css选择器
2014/03/19 HTML / CSS
2013年学期结束动员演讲稿
2014/01/07 职场文书
大学生感恩父母演讲稿
2014/08/28 职场文书
副校长竞聘演讲稿
2014/09/01 职场文书
Python-typing: 类型标注与支持 Any类型详解
2021/05/10 Python
Python matplotlib多个子图绘制整合
2022/04/13 Python