Python 中的「数组」:list 与 array 模块
Python 没有像 C/Java 那样单独的 array 关键字类型。日常里顺序、可变、可索引的序列,多数用 列表(list) 即可。
array 标准库模块提供 array.array:元素类型由 类型码(typecode) 固定,在内存中比「混用类型的列表」更紧凑,适合大批量同类型数字(与 C 数组交互、文件二进制读写等场景)。
下面约定:文中的 array 多指 array.array 实例;list 指内置列表。
list 与 array.array 怎么选?
列表 list | array.array | |
|---|---|---|
| 元素类型 | 任意对象,可混用 | 由类型码限定,本质同构 |
| 典型用途 | 通用容器、业务逻辑 | 紧凑存储、与 C/二进制对接 |
| 方法 | 丰富(见列表教程) | 序列常见操作 + tolist 等 |
科学计算里更常用第三方 numpy.ndarray,与本篇标准库 array 不同。
类型码(typecode)
构造方式:array.array(typecode[, iterable])。
常用类型码(与 C 类型对应关系因平台/实现略有差异,以官方文档为准):
| 类型码 | C 类型 | Python 类型 | 说明(概要) |
|---|---|---|---|
'b' | signed char | int | 有符号字节 |
'B' | unsigned char | int | 无符号字节 |
'h' | signed short | int | 有符号短整型 |
'H' | unsigned short | int | 无符号短整型 |
'i' | signed int | int | 有符号整型(常用) |
'I' | unsigned int | int | 无符号整型 |
'l' | signed long | int | 有符号长整型 |
'L' | unsigned long | int | 无符号长整型 |
'q' | signed long long | int | 有符号长长整型 |
'Q' | unsigned long long | int | 无符号长长整型 |
'f' | float | float | 单精度浮点 |
'd' | double | float | 双精度浮点(常用) |
'u'(旧版 Unicode 字符)已弃用,新代码请用 str、list[str] 等表示文本,勿依赖 array('u', ...)。
完整说明见官方文档 array — 高效的数值数组。
创建与查看类型
python
import array
int_array = array.array("i", [1, 2, 3, 4])
float_array = array.array("f", [1.1, 2.2, 3.3, 4.4])
print(int_array)
print(float_array)
print(type(int_array))输出(浮点打印精度因环境略有差异):
text
array('i', [1, 2, 3, 4])
array('f', [1.100000023841858, 2.200000047683716, 3.299999952316284, 4.400000095367432])
<class 'array.array'>类型不一致时,创建或追加可能报错,例如向 'i' 数组放入非整数。
遍历与索引
python
import array
int_array = array.array("i", [1, 2, 3, 4])
for a in int_array:
print(a)
for b in range(len(int_array)):
print(f"int_array[{b}] = {int_array[b]}")支持负索引,与列表类似:
python
int_array = array.array("i", [10, 20, 30, 40, 50, 60, 70, 80])
print(int_array[-2]) # 70
print(int_array[-5]) # 40insert 与 append
python
import array
int_array = array.array("i", [1, 2, 3, 4])
int_array.insert(0, -1) # [-1, 1, 2, 3, 4]
int_array.insert(2, -2) # [-1, 1, -2, 2, 3, 4]
print(int_array)
int_array = array.array("i", [1, 2, 3, 4])
int_array.append(-3)
print(int_array) # array('i', [1, 2, 3, 4, -3])remove、pop
remove(x):删除第一个值等于 x 的元素;不存在则 ValueError。
python
import array
int_array = array.array("i", [1, 2, 3, 4])
int_array.remove(2)
print(int_array) # array('i', [1, 3, 4])
int_array = array.array("i", [1, 2, 3, 4])
try:
int_array.remove(20)
except ValueError as e:
print(e)pop([i]):删除并返回下标 i 处元素;省略 i 则弹出最后一个。
python
import array
int_array = array.array("i", [1, 2, 3, 4])
last_element = int_array.pop()
print(last_element) # 4
print(int_array) # array('i', [1, 2, 3])
second_element = int_array.pop(1)
print(second_element) # 2
print(int_array) # array('i', [1, 3])切片
切片得到新的 array,原数组不变;支持负索引。
python
import array
int_array = array.array("i", [0, 1, 2, 3, 4, 5])
print(int_array[3:]) # array('i', [3, 4, 5])
print(int_array[:2]) # array('i', [0, 1])
print(int_array[1:3]) # array('i', [1, 2])
print(int_array[-2:]) # array('i', [4, 5])
print(int_array[:-2]) # array('i', [0, 1, 2, 3])index、count
python
import array
int_array = array.array("i", [0, 1, 2, 3, 1, 2])
print(f"1 首次出现在下标 {int_array.index(1)}")
try:
print(int_array.index(20))
except ValueError as e:
print(e)python
int_array = array.array("i", [0, 1, 1, 0])
print(int_array.count(1)) # 2
print(int_array.count(10)) # 0按下标更新
python
import array
int_array = array.array("i", [0, 1, 2, 3, 1, 2])
int_array[0] = -1
int_array[1] = -2
print(int_array)
try:
int_array[10] = -10
except IndexError as e:
print(e)reverse
python
import array
int_array = array.array("i", [0, 1, 2, 3])
int_array.reverse()
print(int_array) # array('i', [3, 2, 1, 0])extend
将可迭代对象中的元素追加到末尾;元素类型须与数组类型码兼容。
python
import array
array1 = array.array("i", [0, 1])
array2 = array.array("i", [2, 3, 4])
array1.extend(array2)
print(array1) # array('i', [0, 1, 2, 3, 4])
print(array2) # array('i', [2, 3, 4])
array2.extend([1, 2])
print(array2) # array('i', [2, 3, 4, 1, 2])
array1 = array.array("i", [1])
array1.extend(sorted({0, 2})) # 集合无序,排序后顺序确定
print(array1) # array('i', [1, 0, 2])与列表互转:tolist
python
import array
int_array = array.array("i", [0, 1, 2, 3])
print(int_array.tolist()) # [0, 1, 2, 3]也可用 list(int_array) 得到列表(再拷贝一层视实现而定,一般用于小数据即可)。
小结
- 通用序列优先
list;需要定类型、省内存或对接 C/二进制 时考虑array.array。 - 用 类型码 指定元素类型;
'u'已弃用,文本用str/list。 - 常用操作与列表类似:索引、切片、
append/insert/pop/remove/index/count/reverse/extend,另tolist()转列表。