一文搞懂NumPy中的深拷贝与浅拷贝

苏见山
苏见山
发布时间:2026-10-15 | 4人浏览过
原创

本文详细解析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深拷贝与浅拷贝的介绍到此结束,更多相关内容请查阅本站历史文章或继续浏览后续文章,感谢支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表