array
— 数值型数组的有效表示¶
此模块定义了一种对象类型,它可以紧凑地表示基本值的数组:字符、整数、浮点数。数组是序列类型,其行为与列表非常相似,只是存储在其中的对象的类型受到限制。类型在对象创建时通过使用 类型代码 指定,该代码是一个单字符。定义了以下类型代码
类型代码 |
C 类型 |
Python 类型 |
最小字节数 |
备注 |
---|---|---|---|---|
|
signed char |
int |
1 |
|
|
unsigned char |
int |
1 |
|
|
wchar_t |
Unicode 字符 |
2 |
(1) |
|
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 |
|
|
float |
float |
4 |
|
|
double |
float |
8 |
备注
根据平台不同,它可以是 16 位或 32 位。
版本 3.9 中的变化:
array('u')
现在使用wchar_t
作为 C 类型,而不是已弃用的Py_UNICODE
。此更改不会影响其行为,因为自 Python 3.3 起,Py_UNICODE
就是wchar_t
的别名。自 3.3 版起弃用,将在 4.0 版中移除。
值的实际表示形式由机器体系结构决定(严格来说,由 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'
;否则会引发ValueError
。使用array.frombytes(unicodestring.encode(enc))
将 Unicode 数据追加到其他类型的数组。
- 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。
- reverse()¶
反转数组中项目的顺序。
- tobytes()¶
将数组转换为机器值数组,并返回字节表示形式(与
tofile()
方法写入文件的字节序列相同。)3.2 版新增: 为了清晰起见,
tostring()
已重命名为tobytes()
。
- tolist()¶
将数组转换为具有相同项目的普通列表。
- tounicode()¶
将数组转换为 Unicode 字符串。数组必须具有类型
'u'
;否则会引发ValueError
。使用array.tobytes().decode(enc)
从其他类型的数组中获取 Unicode 字符串。
数组对象的字符串表示形式为 array(typecode, initializer)
。如果数组为空,则省略 initializer,否则,如果 typecode 为 'u'
,则它是一个 Unicode 字符串,否则它是一个数字列表。只要使用 from array import array
导入了 array
类,则保证可以使用 eval()
将字符串表示形式转换回具有相同类型和值的数组。如果它包含相应的浮点值,则还必须定义变量 inf
和 nan
。示例
array('l')
array('u', 'hello \u2641')
array('l', [1, 2, 3, 4, 5])
array('d', [1.0, 2.0, 3.14, -inf, nan])