Abotw's Space

Back

这三种数据结构在 Python 生态系统中都用于存储数据集合,但它们的设计哲学和侧重点有显著不同。

特性Python List (列表)Python Tuple (元组)NumPy Array (数组)
可变性 (Mutability)可变 (Mutable):创建后可以修改、添加或删除元素。不可变 (Immutable):创建后不能修改、添加或删除元素。通常可变 (Mutable):元素的值可以修改。大小是固定的,修改形状或数据类型需要创建新数组。
元素类型异构 (Heterogeneous):可以存储不同类型的数据 (如 int, str, float)。异构 (Heterogeneous):可以存储不同类型的数据。同构 (Homogeneous):所有元素必须是相同类型的(如 numpy.int64)。
用途/设计侧重通用序列:用于存储任何类型的有序集合,灵活且功能丰富,但效率非最高。数据记录:用于存储相关联但类型可能不同的数据项的集合,保护数据的完整性。科学计算/数值计算:专为高效存储和操作大型同构数值数据集而设计,支持向量化操作。
内存/效率存储开销大,因为需要存储每个元素的类型信息和引用。速度相对较慢存储开销与 List 类似,但由于不可变,在某些情况下略快,可作为字典键使用。内存连续且紧凑,存储效率极高。底层用 C 语言实现,计算速度极快(尤其是对大型数组的批量操作)。
维度仅一维。若要表示多维数据,需要使用嵌套 List仅一维。若要表示多维数据,需要使用嵌套 Tuple多维数组 (N-dimensional Array):支持从 1D 到 N-D 的任意维度。

1. List (列表)#

List 是最灵活的序列类型,支持原地修改操作。

  • 创建: my_list = [1, 'two', 3.0]
  • 访问/切片: my_list[0] (第一个元素), my_list[1:3] (切片)
  • 修改: my_list[0] = 10 (原地修改元素)
  • 添加: my_list.append(4) (末尾添加), my_list.insert(1, 'new') (指定位置插入)
  • 删除: my_list.pop() (删除并返回最后一个), my_list.remove('new') (删除第一个匹配值), del my_list[0]
  • 查找/计数: my_list.index(3.0), my_list.count(1)
  • 排序: my_list.sort() (原地排序), sorted(my_list) (返回新列表)
  • 连接/复制: list1 + list2 (连接), list1.copy() (浅拷贝)

2. Tuple (元组)#

Tuple 是不可变序列,操作主要围绕访问、查找和创建新的 Tuple。

  • 创建: my_tuple = (1, 'two', 3.0)my_tuple = 1, 'two', 3.0
  • 访问/切片: my_tuple[0], my_tuple[1:3] (与 List 相同)
  • 查找/计数: my_tuple.index(3.0), my_tuple.count(1) (与 List 相同)
  • 解包: a, b, c = my_tuple
  • 连接/重复: tuple1 + tuple2 (连接), tuple1 * 3 (重复)

注意: Tuple 不支持 append(), insert(), pop(), remove(), sort() 等原地修改操作。

3. NumPy Array (数组)#

NumPy Array 核心在于向量化广播,实现高效的数值计算。

  • 创建: import numpy as np, my_array = np.array([1, 2, 3]), np.zeros((2, 3)) (创建全零矩阵), np.arange(5) (创建等差数组)
  • 属性查询: my_array.shape (形状), my_array.dtype (数据类型), my_array.ndim (维度)
  • 访问/切片: my_array[0, 1] (多维访问), 布尔索引 (my_array[my_array > 2])
  • 形状操作: my_array.reshape(new_shape) (返回新形状数组), my_array.T (转置)
  • 元素级运算 (向量化): array1 + array2, array1 * 2, np.sin(array1) (比 List 循环快得多)
  • 聚合操作: my_array.sum(), my_array.mean(), my_array.std() (标准差), my_array.max(axis=0) (沿指定轴的最大值)
  • 连接/分割: np.concatenate((a, b), axis=0), np.split(array, 2)
List、Tuple 与 NumPy Array 的设计哲学与核心操作
https://abotw.github.io/blog/list-tuple-ndarry
Author Abotw
Published at December 6, 2025
Comment seems to stuck. Try to refresh?✨