8.6. array —有效的数字数组

该模块定义了一个对象类型,该对象类型可以紧凑地表示一个基本值数组:字符,整数,浮点数。数组是序列类型,其行为与列表非常相似,不同之处在于数组中存储的对象类型受到约束。类型是在对象创建时使用类型代码指定的,该代码是单个字符。定义了以下类型代码:

Type codeC TypePython Type最小大小(以字节为单位)
'c'charcharacter1
'b'signed charint1
'B'unsigned charint1
'u'Py_UNICODEUnicode character2 (请参见 Comments)
'h'signed shortint2
'H'unsigned shortint2
'i'signed intint2
'I'unsigned intlong2
'l'signed longint4
'L'unsigned longlong4
'f'floatfloat4
'd'doublefloat8

Note

'u'类型代码对应于 Python 的 unicode 字符。在狭窄的 Unicode 版本中,这是 2 个字节,在广泛的版本中,这是 4 个字节。

值的实际表示形式由机器体系结构(严格来说,由 C 实现)确定。可以passitemsize属性访问实际大小。检索到'L''I'项时存储的值将表示为 Python 长整数,因为 Python 的纯整数类型不能表示 C 的完整无符号(长)整数范围。

该模块定义以下类型:

    • class * array. array(* typecode * [,* initializer *])
    • 一个新数组,其项受* typecode 限制,并从可选的 initializer *值进行初始化,该值必须是列表,字符串或可迭代的适当类型的元素。

在版本 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 接口时,这有时很有用。只要数组存在并且没有对其应用任何长度更改操作,返回的数字都是有效的。

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 *)

    • 从文件对象* f 中读取 n 个项(作为机器值),并将它们附加到数组的末尾。如果少于 n *个项目可用,则引发EOFError,但仍然将可用项目插入到数组中。 * f *必须是真实的内置文件对象;使用read()方法的其他操作将无法执行。
  • 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 数据附加到其他类型的数组。
  • array. index(* x *)

    • 返回最小的* i ,使得 i 是数组中首次出现的 x *的索引。
  • array. insert(* i x *)

    • 在位置* i 之前的数组中插入一个值为 x *的新项目。负值被视为相对于数组末端。
  • array. pop([* i *])

    • 从数组中删除索引为* i *的项,并将其返回。可选参数默认为-1,因此默认情况下将删除并返回最后一项。
  • 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 字符串。
  • 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)数据。

  • 数值 Python 文档

  • Numeric Python 扩展(NumPy)定义了另一种数组类型。有关数值 Python 的更多信息,请参见http://www.numpy.org/