在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理


Posted in Python onApril 14, 2022

1. 引言

深拷贝和浅拷贝是Python中重要的概念,本文重点介绍在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理。

闲话少说,我们直接开始吧!

2. 浅拷贝

2.1 问题引入

我们来举个栗子,如下所示我们有两个数组a和b,样例代码如下:

import numpy as np

a = np.array([1, 2, 3])
b = a

print('a =', a)
print('b =', b)

输出如下:

a = [1 2 3]
b = [1 2 3]

此时如果我们对数组a做如下改变,代码如下:

import numpy as np

a = np.array([1, 2, 3])
b = a

a [0] = 42

print('a =', a)
print('b =', b)

那么我们的问题为: 此时b的值应该为多少?

运行上述代码后,我们得到输出如下:

a = [42 2 3]
b = [42 2 3]

2.2 问题剖析

也许有人会觉得输出应该为a=[42 2 3] 和 b=[1 2 3] ,但是运行上述代码后我们发现a和b的值均发生了相应的改变。这主要是由于在Numpy中对变量的赋值操作,实际上发生的为浅拷贝。

换句话说,此时两个变量指向同一块内存地址,如下所示:

在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理

所以,此时如果我们修改数组original_array中的某个元素,copy_array 由于和original_array公用同一块内存,所以其中的元素也会发生相应的变化。

3. 深拷贝

3.1 举个栗子

如果我们想要对Numpy数组执行深拷贝,此时我们可以使用函数copy()。相关的样例代码如下:

import numpy as np

a = np.array([1, 2, 3])
b = a.copy()

print('a =', a)
print('b =', b)

输出如下:

a = [1 2 3]
b = [1 2 3]

此时,如果我们改变数组a中的元素,代码如下:

import numpy as np

a = np.array([1, 2, 3])
b = a.copy()

a [0] = 42

print('a =', a)
print('b =', b)

此时的代码输出如下:

a = [42 2 3]
b = [1 2 3]

3.2 探究原因

观察上述输出,我们可以清楚地看到数组a发生了改变而数组b没有发生变化,这是由于我们使用了深拷贝。此时的内存地址如下:

在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理

由于 original_array和copy_array指向不同的内存地址空间,所以此时我们对original_array的改变并不会对copy_array带来影响。

4. 技巧总结

经过上述对深拷贝和浅拷贝的举例和示例,相信大家都已有了清晰的认识,接着我们对上述知识点进行总结,归纳如下:

4.1 判断是否指向同一内存

如果我们需要知道两个变量是否指向同一块内存地址,我们可以方便地使用is操作。

浅拷贝示例:

a = np.array([1, 2, 3])
b = a
print(b is a)

输出如下:

True

深拷贝示例:

a = np.array([1, 2, 3])
b = a.copy()
print(b is a)

输出如下:

False

4.2 其他数据类型

尽管本文中所有的示例都使用了NumPy数组,但本文中所涉及的知识也适用于Python中的列表和字典等其他数据类型。

总之,我们需要时刻记载心中:在浅拷贝中,原始数组和新的数组共同执行同一块内存;同时在深拷贝中,新的数组是原始数据的单独的拷贝,它指向一块新的内存地址。

5. 总结

本文重点介绍了Python中对Numpy数组操作的浅拷贝和深拷贝的概念和背后的原理,同时给出了相应的代码示例。

到此这篇关于一文带你搞懂Numpy中的深拷贝和浅拷贝的文章就介绍到这了!

Python 相关文章推荐
python采集博客中上传的QQ截图文件
Jul 18 Python
wxPython框架类和面板类的使用实例
Sep 28 Python
python生成词云的实现方法(推荐)
Jun 13 Python
python中subprocess批量执行linux命令
Apr 27 Python
Python中存取文件的4种不同操作
Jul 02 Python
Python爬取数据保存为Json格式的代码示例
Apr 09 Python
python 求某条线上特定x值或y值的点坐标方法
Jul 09 Python
python爬虫 urllib模块url编码处理详解
Aug 20 Python
python实现简单的购物程序代码实例
Mar 03 Python
Python 实现打印单词的菱形字符图案
Apr 12 Python
python实现局部图像放大
Nov 17 Python
Python matplotlib绘制雷达图
Apr 13 Python
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
Apr 14 #Python
Python中time标准库的使用教程
Apr 13 #Python
Python函数对象与闭包函数
Apr 13 #Python
Python作用域和名称空间的详细介绍
Apr 13 #Python
Python获取字典中某个key的value
Apr 13 #Python
Python基本的内置数据类型及使用方法
Apr 13 #Python
Python如何使用循环结构和分支结构
Apr 13 #Python
You might like
《OVERLORD》手游英文版即将上线 手机上也能扮演骨王
2020/04/09 日漫
我用php+mysql写的留言本
2006/10/09 PHP
PHP中的extract的作用分析
2008/04/09 PHP
php mssql 日期出现中文字符的解决方法
2009/03/10 PHP
初识Laravel
2014/10/30 PHP
PHP IDE phpstorm 常用快捷键
2015/05/18 PHP
php使用COPY函数更新配置文件的方法
2015/06/18 PHP
中高级PHP程序员应该掌握哪些技术?
2016/09/23 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
表单(FORM)的一些实用效果代码
2007/03/25 Javascript
Javascript面向对象编程(二) 构造函数的继承
2011/08/28 Javascript
JavaScript中读取和保存文件实例
2014/05/08 Javascript
10分钟学会写Jquery插件实例教程
2014/09/06 Javascript
JavaScript ES6的新特性使用新方法定义Class
2016/06/28 Javascript
详解js中Number()、parseInt()和parseFloat()的区别
2016/12/20 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
JS打开摄像头并截图上传示例
2017/02/18 Javascript
Vue2.0 vue-source jsonp 跨域请求
2017/08/04 Javascript
微信小程序自定义prompt组件步骤详解
2018/06/12 Javascript
React 组件中的 bind(this)示例代码
2018/09/16 Javascript
vue-router命名路由和编程式路由传参讲解
2019/01/19 Javascript
原生JavaScript之es6中Class的用法分析
2020/02/23 Javascript
JS将指定的某个字符全部转换为其他字符实例代码
2020/10/13 Javascript
浅谈Python中的全局锁(GIL)问题
2019/01/11 Python
Python学习笔记之自定义函数用法详解
2019/06/08 Python
python pycharm最新版本激活码(永久有效)附python安装教程
2020/09/18 Python
加拿大百叶窗和窗帘定制网站:Blinds
2017/01/30 全球购物
Python如何实现单例模式
2016/06/03 面试题
自考生自我评价分享
2014/01/18 职场文书
平面设计专业求职信
2014/08/09 职场文书
民主评议党员总结
2014/10/20 职场文书
幼儿园庆元旦主持词
2015/07/06 职场文书
2019个人工作总结
2019/06/21 职场文书
导游词之晋城蟒河
2019/12/12 职场文书
浅谈golang 中time.After释放的问题
2021/05/05 Golang
配置nginx负载均衡
2022/05/06 Servers