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

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

本文详细解析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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。