array
--- 高效的数值数组¶
此模块定义了一种对象类型,可以紧凑地表示基本值的数组:字符、整数、浮点数。数组是序列类型,其行为与列表非常相似,但其中存储的对象类型是受限的。类型是在对象创建时通过使用一个*类型码*指定的,该类型码是单个字符。定义了以下类型码:
类型码 |
C 类型 |
Python 类型 |
最小字节数 |
备注 |
---|---|---|---|---|
|
signed char |
int |
1 |
|
|
unsigned char |
int |
1 |
|
|
wchar_t |
Unicode 字符 |
2 |
(1) |
|
Py_UCS4 |
Unicode 字符 |
4 |
(2) |
|
signed short |
int |
2 |
|
|
unsigned short |
int |
2 |
|
|
signed int |
int |
2 |
|
|
unsigned int |
int |
2 |
|
|
signed long |
int |
4 |
|
|
unsigned long |
int |
4 |
|
|
signed long long |
int |
8 |
|
|
unsigned long long |
int |
8 |
|
|
浮点数 |
浮点数 |
4 |
|
|
double |
浮点数 |
8 |
备注
根据平台的不同,可以是 16 位或 32 位。
在 3.9 版本发生变更:
array('u')
现在使用wchar_t
作为 C 类型,而不是已弃用的Py_UNICODE
。此更改不影响其行为,因为自 Python 3.3 起,Py_UNICODE
就是wchar_t
的别名。从 3.3 版起弃用,将在 3.16 版中移除: 请迁移到
'w'
类型码。在 3.13 版本加入。
值的实际表示由机器架构(严格来说,由 C 实现)决定。实际大小可以通过 array.itemsize
属性访问。
该模块定义了以下项:
- array.typecodes¶
一个包含所有可用类型码的字符串。
该模块定义了以下类型:
- class array.array(typecode[, initializer])¶
一个新数组,其元素受 *typecode* 限制,并由可选的 *initializer* 值进行初始化,该值必须是
bytes
或bytearray
对象、Unicode 字符串,或包含适当类型元素的可迭代对象。如果给定一个
bytes
或bytearray
对象,初始化程序将被传递给新数组的frombytes()
方法;如果给定一个 Unicode 字符串,初始化程序将被传递给fromunicode()
方法;否则,初始化程序的迭代器将被传递给extend()
方法,以向数组添加初始项。数组对象支持普通的序列操作,如索引、切片、拼接和重复。当使用切片赋值时,所赋的值必须是具有相同类型码的数组对象;在所有其他情况下,会引发
TypeError
。数组对象也实现了缓冲区接口,并且可以在任何支持 类字节对象 的地方使用。引发一个参数为
typecode
,initializer
的 审计事件array.__new__
。- typecode¶
用于创建数组的类型码字符。
- itemsize¶
内部表示中单个数组元素的字节长度。
- append(x)¶
将一个值为 *x* 的新项追加到数组的末尾。
- buffer_info()¶
返回一个元组
(address, length)
,给出当前内存地址和用于保存数组内容的缓冲区的元素个数。内存缓冲区的大小(以字节为单位)可以通过array.buffer_info()[1] * array.itemsize
计算。这在处理需要内存地址的低级(且本质上不安全)I/O 接口时偶尔有用,例如某些ioctl()
操作。只要数组存在并且没有对其应用改变长度的操作,返回的数值就有效。备注
当从用 C 或 C++ 编写的代码中使用数组对象时(这是有效利用此信息的唯一方法),使用数组对象支持的缓冲区接口更有意义。此方法为保持向后兼容性而保留,在新代码中应避免使用。缓冲区接口在 缓冲协议 中有文档说明。
- byteswap()¶
“字节交换”数组中的所有项。这只支持大小为 1、2、4 或 8 字节的值;对于其他类型的值,会引发
RuntimeError
。当从具有不同字节序的机器上写入的文件中读取数据时,这很有用。
- count(x)¶
返回 *x* 在数组中出现的次数。
- extend(iterable)¶
将 *iterable* 中的项追加到数组的末尾。如果 *iterable* 是另一个数组,它必须具有*完全*相同的类型码;否则,将引发
TypeError
。如果 *iterable* 不是数组,它必须是可迭代的,并且其元素必须是正确的类型才能追加到数组中。
- frombytes(buffer)¶
从 类字节对象 中追加项目,将其内容解释为机器值数组(就好像它是使用
fromfile()
方法从文件中读取的一样)。在 3.2 版本加入: 为了清晰起见,
fromstring()
已重命名为frombytes()
。
- fromlist(list)¶
从列表中追加项。这等效于
for x in list: a.append(x)
,不同之处在于,如果出现类型错误,数组将保持不变。
- fromunicode(s)¶
用给定的 Unicode 字符串中的数据扩展此数组。数组的类型码必须是
'u'
或'w'
;否则会引发ValueError
。要将 Unicode 数据追加到其他类型的数组中,请使用array.frombytes(unicodestring.encode(enc))
。
- index(x[, start[, stop]])¶
返回最小的 *i*,使得 *i* 是 *x* 在数组中首次出现的索引。可选参数 *start* 和 *stop* 可用于在数组的子切片中搜索 *x*。如果未找到 *x*,则引发
ValueError
。在 3.10 版本发生变更: 添加了可选的 *start* 和 *stop* 参数。
- insert(i, x)¶
在位置 *i* 之前插入一个值为 *x* 的新项。负值被视为相对于数组的末尾。
- pop([i])¶
从数组中移除索引为 *i* 的项并返回它。可选参数默认为
-1
,因此默认情况下会移除并返回最后一个项。
- remove(x)¶
从数组中移除第一次出现的 *x*。
- clear()¶
从数组中移除所有元素。
在 3.13 版本加入。
- reverse()¶
反转数组中项的顺序。
- tobytes()¶
将数组转换为机器值数组,并返回字节表示(与通过
tofile()
方法写入文件的字节序列相同)。在 3.2 版本加入: 为了清晰起见,
tostring()
已重命名为tobytes()
。
- tolist()¶
将数组转换为具有相同项的普通列表。
- tounicode()¶
将数组转换为 Unicode 字符串。数组的类型必须是
'u'
或'w'
;否则会引发ValueError
。要从其他类型的数组获取 Unicode 字符串,请使用array.tobytes().decode(enc)
。
数组对象的字符串表示形式为 array(typecode, initializer)
。如果数组为空,则省略 *initializer*;否则,如果 *typecode* 是 'u'
或 'w'
,它是一个 Unicode 字符串,否则它是一个数字列表。只要通过 from array import array
导入了 array
类,就可以保证该字符串表示能够使用 eval()
转换回具有相同类型和值的数组。如果数组包含相应的浮点值,则还必须定义变量 inf
和 nan
。示例:
array('l')
array('w', 'hello \u2641')
array('l', [1, 2, 3, 4, 5])
array('d', [1.0, 2.0, 3.14, -inf, nan])