一文搞懂NumPy中的深拷贝与浅拷贝
本文详细解析Python NumPy库中数组赋值的浅拷贝机制与使用copy()方法实现的深拷贝原理。通过对比内存地址指向,展示修改数组元素时两种操作对原始数据的不同影响,并提供判断内存共享的is运算符技巧,帮助开发者避免数据意外修改。
1. 引言
在Python编程中,深拷贝与浅拷贝是核心概念之一。本文旨在深入探讨NumPy库中这两种拷贝操作的定义及其底层实现原理。
让我们直接切入正题,开始学习。
2. 浅拷贝
2.1 问题引入
首先通过一个具体案例进行说明,假设我们定义了两个NumPy数组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中的变量赋值操作本质上执行的是浅拷贝。
换言之,此时变量a和b指向内存中的同一块地址,示意如下:

因此,当我们修改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数组操作的浅拷贝与深拷贝概念及原理,并提供了相应的代码示例。
关于NumPy深拷贝与浅拷贝的介绍到此结束,更多相关内容请查阅本站历史文章或继续浏览后续文章,感谢支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













