深入理解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 pickle 和 shelve模块的用法
Sep 16 Python
Python CSV模块使用实例
Apr 09 Python
简单谈谈python中的语句和语法
Aug 10 Python
利用Python如何生成hash值示例详解
Dec 20 Python
ubuntu环境下python虚拟环境的安装过程
Jan 07 Python
Python将list中的string批量转化成int/float的方法
Jun 26 Python
python特性语法之遍历、公共方法、引用
Aug 08 Python
python twilio模块实现发送手机短信功能
Aug 02 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
Feb 06 Python
jupyter notebook的安装与使用详解
May 18 Python
Python Unittest原理及基本使用方法
Nov 06 Python
next在python中返回迭代器的实例方法
Dec 15 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
从C/C++迁移到PHP——判断字符类型的函数
2006/10/09 PHP
10条PHP编程习惯助你找工作
2008/09/29 PHP
php 验证码制作(网树注释思想)
2009/07/20 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
2013/08/09 PHP
php中的ini配置原理详解
2014/10/14 PHP
PHP-X系列教程之内置函数的使用示例
2017/10/16 PHP
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
JS实现图片横向滚动效果示例代码
2013/09/04 Javascript
JS案例分享之金额小写转大写
2014/05/15 Javascript
js jquery获取当前元素的兄弟级 上一个 下一个元素
2015/09/01 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
Vue.js -- 过滤器使用总结
2017/02/18 Javascript
深入浅析JSONAPI在PHP中的应用
2017/12/24 Javascript
Vue中mintui的field实现blur和focus事件的方法
2018/08/25 Javascript
Python编写百度贴吧的简单爬虫
2015/04/02 Python
Sublime开发python程序的示例代码
2018/01/24 Python
解决pycharm回车之后不能换行或不能缩进的问题
2019/01/16 Python
python实现引用其他路径包里面的模块
2020/03/09 Python
Python函数参数分类原理详解
2020/05/28 Python
弄清Pytorch显存的分配机制
2020/12/10 Python
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
使用CSS3制作一个简单的Chrome模拟器
2015/07/15 HTML / CSS
结合CSS3的新特性来总结垂直居中的实现方法
2016/05/30 HTML / CSS
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
video实现有声音自动播放的实现方法
2020/05/20 HTML / CSS
俄罗斯品牌服装在线商店:VIPAVENUE
2020/08/10 全球购物
Linux管理员面试经常问道的相关命令
2013/04/29 面试题
中层干部竞争上岗演讲稿
2014/01/13 职场文书
安全协议书
2014/04/23 职场文书
健康教育评估方案
2014/05/25 职场文书
会计求职自荐信
2014/06/20 职场文书
小学生志愿者活动方案
2014/08/23 职场文书
构建和谐校园倡议书
2015/01/19 职场文书
大明湖导游词
2015/02/03 职场文书
python 判断文件或文件夹是否存在
2022/03/18 Python
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js