【Python】一文弄懂Numpy中的深拷贝和浅拷贝(深拷贝和浅拷贝Python)

网友投稿 419 2022-09-08


【Python】一文弄懂Numpy中的深拷贝和浅拷贝(深拷贝和浅拷贝Python)

1. 引言

深拷贝和浅拷贝是Python中重要的概念,本文重点介绍在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理。闲话少说,我们直接开始吧!

2. 浅拷贝

2.1 问题引入

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

import numpy as npa = np.array([1, 2, 3])b = aprint('a =', a)print('b =', b)

输出如下:

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

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

import numpy as npa = np.array([1, 2, 3])b = aa [0] = 42print('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​​中对变量的赋值操作,实际上发生的为浅拷贝。

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

所以,此时如果我们修改数组​​original_array​​中的某个元素,`copy_array

​​由于和​​original_array`公用同一块内存,所以其中的元素也会发生相应的变化。

3. 深拷贝

3.1 举个栗子

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

import numpy as npa = 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 npa = np.array([1, 2, 3])b = a.copy()a [0] = 42print('a =', a)print('b =', b)

此时的代码输出如下:

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

3.2 探究原因

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

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

4. 技巧总结

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

4.1 判断是否指向同一内存

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

浅拷贝示例:

a = np.array([1, 2, 3])b = aprint(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数组操作的浅拷贝和深拷贝的概念和背后的原理,同时给出了相应的代码示例。您学废了吗?


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python自动化--4.python类型转换(python类型转换方法)
下一篇:教你bat脚本一键配置java开发环境
相关文章

 发表评论

暂时没有评论,来抢沙发吧~