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
中对变量的赋值操作,实际上发生的为浅拷贝。
换句话说,此时两个变量指向同一块内存地址,如下所示:
所以,此时如果我们修改数组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
没有发生变化,这是由于我们使用了深拷贝。此时的内存地址如下:
由于 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数组操作的浅拷贝和深拷贝的概念和背后的原理,同时给出了相应的代码示例。
您学废了吗?
关注公众号《AI算法之道》,获取更多AI算法资讯。