深入理解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中的递归函数
Apr 27 Python
Python的Django框架中URLconf相关的一些技巧整理
Jul 18 Python
不要用强制方法杀掉python线程
Feb 26 Python
Numpy数组的保存与读取方法
Apr 04 Python
Pandas标记删除重复记录的方法
Apr 08 Python
解决安装tensorflow遇到无法卸载numpy 1.8.0rc1的问题
Jun 13 Python
Python 中字符串拼接的多种方法
Jul 30 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
Aug 12 Python
解决tensorflow由于未初始化变量而导致的错误问题
Jan 06 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
Feb 06 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
Feb 24 Python
Python并发concurrent.futures和asyncio实例
May 04 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中利用post传递字符串重定向的实现代码
2011/04/21 PHP
php页面跳转代码 输入网址跳转到你定义的页面
2013/03/28 PHP
php打开远程文件的方法和风险及解决方法
2013/11/12 PHP
PHP实现补齐关闭的HTML标签
2016/03/22 PHP
PHP 接入支付宝即时到账功能
2016/09/18 PHP
JavaScript 构造函数 面相对象学习必备知识
2010/06/09 Javascript
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
JS操作图片(增,删,改) 例子
2013/04/17 Javascript
JS父页面与子页面相互传值方法
2014/03/05 Javascript
基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码
2014/05/11 Javascript
教你如何自定义百度分享插件以及bshare分享插件的分享按钮
2014/06/20 Javascript
js游戏人物上下左右跑步效果代码分享
2015/08/28 Javascript
浅谈js构造函数的方法与原型prototype
2016/07/04 Javascript
微信小程序本作用域下调用全局JS详解及实例
2017/02/22 Javascript
微信小程序删除处理详解
2017/08/16 Javascript
AngularJs 最新验证手机号码的实例,成功测试通过
2017/11/26 Javascript
解析Vue 2.5的Diff算法
2017/11/28 Javascript
vue+vuex+axios+echarts画一个动态更新的中国地图的方法
2017/12/19 Javascript
vue地区选择组件教程详解
2018/05/04 Javascript
微信小程序实现笑脸评分功能
2018/11/03 Javascript
深入解析koa之异步回调处理
2019/06/17 Javascript
一次让你了解全部JavaScript的作用域
2019/06/24 Javascript
在VUE中实现文件下载并判断状态的方法
2019/11/08 Javascript
JavaScript数值类型知识汇总
2019/11/17 Javascript
bootstrap实现嵌套模态框的实例代码
2020/01/10 Javascript
全网小程序接口请求封装实例代码
2020/11/06 Javascript
python 定时修改数据库的示例代码
2018/04/08 Python
pandas 实现字典转换成DataFrame的方法
2018/07/04 Python
python使用webdriver爬取微信公众号
2018/08/31 Python
python实现拼图小游戏
2020/02/22 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
PyTorch 中的傅里叶卷积实现示例
2020/12/11 Python
元旦晚会上单位领导演讲稿
2014/01/05 职场文书
初中政治教学反思
2014/01/17 职场文书
2015年计算机教师工作总结
2015/07/22 职场文书
javascript拖曳互换div的位置实现示例
2021/06/28 Javascript