On this page
8.6. array —有效的数字数组
该模块定义了一个对象类型,该对象类型可以紧凑地表示一个基本值数组:字符,整数,浮点数。数组是序列类型,其行为与列表非常相似,不同之处在于数组中存储的对象类型受到约束。类型是在对象创建时使用类型代码指定的,该代码是单个字符。定义了以下类型代码:
Type code | C Type | Python Type | 最小大小(以字节为单位) |
---|---|---|---|
'c' |
char | character | 1 |
'b' |
signed char | int | 1 |
'B' |
unsigned char | int | 1 |
'u' |
Py_UNICODE | Unicode character | 2 (请参见 Comments) |
'h' |
signed short | int | 2 |
'H' |
unsigned short | int | 2 |
'i' |
signed int | int | 2 |
'I' |
unsigned int | long | 2 |
'l' |
signed long | int | 4 |
'L' |
unsigned long | long | 4 |
'f' |
float | float | 4 |
'd' |
double | float | 8 |
Note
'u'
类型代码对应于 Python 的 unicode 字符。在狭窄的 Unicode 版本中,这是 2 个字节,在广泛的版本中,这是 4 个字节。
值的实际表示形式由机器体系结构(严格来说,由 C 实现)确定。可以passitemsize
属性访问实际大小。检索到'L'
和'I'
项时存储的值将表示为 Python 长整数,因为 Python 的纯整数类型不能表示 C 的完整无符号(长)整数范围。
该模块定义以下类型:
-
- class *
array.
array
(* typecode * [,* initializer *])
- 一个新数组,其项受* typecode 限制,并从可选的 initializer *值进行初始化,该值必须是列表,字符串或可迭代的适当类型的元素。
- class *
在版本 2.4 中进行了更改:以前,仅接受列表或字符串。
如果提供了列表或字符串,则将初始化程序传递给新数组的fromlist(),fromstring()或fromunicode()方法(请参见下文),以将初始项添加到数组。否则,将可迭代的初始值设定项传递给extend()方法。
array.
ArrayType
- array的过时别名。
数组对象支持索引,切片,串联和乘法的普通序列操作。使用切片分配时,分配的值必须是具有相同类型代码的数组对象;在所有其他情况下,将引发TypeError。数组对象还实现了缓冲区接口,并且可以在支持缓冲区对象的任何地方使用。
还支持以下数据项和方法:
array.
typecode
- 用于创建数组的类型代码字符。
array.
itemsize
- 内部表示形式中一个数组项的长度(以字节为单位)。
array.
append
(* x *)- 将值* x *的新项目追加到数组的末尾。
array.
buffer_info
( )- 返回一个 Tuples
(address, length)
,该 Tuples 给出当前的内存地址以及用于保存数组内容的缓冲区元素的长度。内存缓冲区的大小(以字节为单位)可以计算为array.buffer_info()[1] * array.itemsize
。在使用需要内存地址(例如某些ioctl()
操作)的低级(本质上不安全)的 I/O 接口时,这有时很有用。只要数组存在并且没有对其应用任何长度更改操作,返回的数字都是有效的。
- 返回一个 Tuples
Note
当使用以 C 或 C 编写的代码使用数组对象(有效利用此信息的唯一方法)时,使用数组对象支持的缓冲区接口更有意义。维护此方法是为了实现向后兼容,因此在新代码中应避免使用此方法。缓冲区接口记录在缓冲区和 Memoryview 对象中。
array.
byteswap
( )- “ Byteswap”数组的所有项目。只有大小为 1、2、4 或 8 个字节的值才支持此Function。对于其他类型的值,将引发RuntimeError。当从以不同字节 Sequences 写在计算机上的文件中读取数据时,此Function很有用。
array.
count
(* x *)- 返回数组中* x *的出现次数。
array.
extend
(可迭代)- 将项目从* iterable 追加到数组的末尾。如果 iterable 是另一个数组,则它必须完全相同的类型代码;否则,将引发TypeError。如果 iterable *不是数组,则它必须是可迭代的,并且其元素必须是要附加到数组的正确类型。
在版本 2.4 中更改:以前,该参数只能是另一个数组。
array.
fromfile
(* f , n *)array.
fromlist
(* list *)- 追加列表中的项目。这等效于
for x in list: a.append(x)
,不同之处在于如果存在类型错误,则数组不变。
- 追加列表中的项目。这等效于
array.
fromstring
(* s *)- 附加字符串中的项目,将字符串解释为机器值的数组(就像使用fromfile()方法从文件中读取字符串一样)。
array.
fromunicode
(* s *)- 使用给定 unicode 字符串中的数据扩展此数组。该数组必须是
'u'
类型的数组;否则引发ValueError。使用array.fromstring(unicodestring.encode(enc))
将 Unicode 数据附加到其他类型的数组。
- 使用给定 unicode 字符串中的数据扩展此数组。该数组必须是
array.
index
(* x *)- 返回最小的* i ,使得 i 是数组中首次出现的 x *的索引。
array.
insert
(* i , x *)- 在位置* i 之前的数组中插入一个值为 x *的新项目。负值被视为相对于数组末端。
array.
pop
([* i *])- 从数组中删除索引为* i *的项,并将其返回。可选参数默认为
-1
,因此默认情况下将删除并返回最后一项。
- 从数组中删除索引为* i *的项,并将其返回。可选参数默认为
array.
read
(* f , n *)- 从 1.5.1 版开始不推荐使用:使用fromfile()方法。
从文件对象* f 中读取 n 个项(作为机器值),并将它们附加到数组的末尾。如果少于 n *个项目可用,则引发EOFError,但仍然将可用项目插入到数组中。 * f *必须是真实的内置文件对象;使用read()方法的其他操作将无法执行。
array.
remove
(* x *)- 从数组中删除第一次出现的* x *。
array.
reverse
( )- 颠倒数组中各项的 Sequences。
array.
tofile
(* f *)- 将所有项目(作为机器值)写入文件对象* f *。
array.
tolist
( )- 将数组转换为具有相同项目的普通列表。
array.
tostring
( )- 将数组转换为机器值数组,然后返回字符串表示形式(与tofile()方法写入文件的字节序列相同)。
array.
tounicode
( )- 将数组转换为 unicode 字符串。该数组必须是
'u'
类型的数组;否则引发ValueError。使用array.tostring().decode(enc)
从其他类型的数组获取 unicode 字符串。
- 将数组转换为 unicode 字符串。该数组必须是
array.
write
(* f *)- 从 1.5.1 版开始不推荐使用:使用tofile()方法。
将所有项目(作为机器值)写入文件对象* f *。
当数组对象被打印或转换为字符串时,它表示为array(typecode, initializer)
。如果数组为空,则Ellipsis* initializer ;否则,如果 typecode *为'c'
,则为字符串;否则为数字列表。只要使用from array import array
导入了array类,就可以保证使用eval()将字符串转换回具有相同类型和值的数组。例子:
array('l')
array('c', 'hello world')
array('u', u'hello \u2641')
array('l', [1, 2, 3, 4, 5])
array('d', [1.0, 2.0, 3.14])
See also
Module struct
打包和解压缩异构二进制数据。
Module xdrlib
在某些远程过程调用系统中使用的打包和拆包外部数据表示(XDR)数据。
Numeric Python 扩展(NumPy)定义了另一种数组类型。有关数值 Python 的更多信息,请参见http://www.numpy.org/。