8.6. array
— 高效的数值数组¶
此模块定义了一种对象类型,可以紧凑地表示基本类型值的数组:字符、整数、浮点数等。 数组属于序列类型,其行为与列表非常相似,不同之处在于其中存储的对象类型是受限的。 类型在对象创建时使用单个字符的 类型码 来指定。 已定义的类型码如下:
类型码 |
C 类型 |
Python 类型 |
以字节表示的最小尺寸 |
---|---|---|---|
|
char |
character |
1 |
|
signed char |
int |
1 |
|
unsigned char |
int |
1 |
|
Py_UNICODE |
Unicode 字符 |
2 (see note) |
|
signed short |
int |
2 |
|
unsigned short |
int |
2 |
|
signed int |
int |
2 |
|
unsigned int |
long |
2 |
|
signed long |
int |
4 |
|
unsigned long |
long |
4 |
|
float |
float |
4 |
|
double |
float |
8 |
注解
The 'u'
typecode corresponds to Python’s unicode character. On narrow
Unicode builds this is 2-bytes, on wide builds this is 4-bytes.
The actual representation of values is determined by the machine architecture
(strictly speaking, by the C implementation). The actual size can be accessed
through the itemsize
attribute. The values stored for 'L'
and
'I'
items will be represented as Python long integers when retrieved,
because Python’s plain integer type cannot represent the full range of C’s
unsigned (long) integers.
这个模块定义了以下类型:
-
class
array.
array
(typecode[, initializer])¶ A new array whose items are restricted by typecode, and initialized from the optional initializer value, which must be a list, string, or iterable over elements of the appropriate type.
在 2.4 版更改: Formerly, only lists or strings were accepted.
If given a list or string, the initializer is passed to the new array’s
fromlist()
,fromstring()
, orfromunicode()
method (see below) to add initial items to the array. Otherwise, the iterable initializer is passed to theextend()
method.
Array objects support the ordinary sequence operations of indexing, slicing,
concatenation, and multiplication. When using slice assignment, the assigned
value must be an array object with the same type code; in all other cases,
TypeError
is raised. Array objects also implement the buffer interface,
and may be used wherever buffer objects are supported.
以下数据项和方法也受到支持:
-
array.
typecode
¶ 用于创建数组的类型码字符。
-
array.
itemsize
¶ 在内部表示中一个数组项的字节长度。
-
array.
append
(x)¶ 添加一个值为 x 的新项到数组末尾。
-
array.
buffer_info
()¶ 返回一个元组
(address, length)
以给出用于存放数组内容的缓冲区元素的当前内存地址和长度。 以字节表示的内存缓冲区大小可通过array.buffer_info()[1] * array.itemsize
来计算。 这在使用需要内存地址的低层级(因此不够安全) I/O 接口时会很有用,例如某些ioctl()
操作。 只要数组存在并且没有应用改变长度的操作,返回数值就是有效的。注解
当在 C 或 C++ 编写的代码中使用数组对象时(这是有效使用此类信息的唯一方式),使用数组对象所支持的缓冲区接口更为适宜。 此方法仅保留用作向下兼容,应避免在新代码中使用。 缓冲区接口的文档参见 Buffers and Memoryview Objects。
-
array.
byteswap
()¶ “字节对调”所有数组项。 此方法只支持大小为 1, 2, 4 或 8 字节的值;对于其他值类型将引发
RuntimeError
。 它适用于从不同字节序机器所生成的文件中读取数据的情况。
-
array.
count
(x)¶ 返回 x 在数组中的出现次数。
-
array.
extend
(iterable)¶ 将来自 iterable 的项添加到数组末尾。 如果 iterable 是另一个数组,它必须具有 完全 相同的类型码;否则将引发
TypeError
。 如果 iterable 不是一个数组,则它必须为可迭代对象并且其元素必须为可添加到数组的适当类型。在 2.4 版更改: Formerly, the argument could only be another array.
-
array.
fromfile
(f, n)¶ Read n items (as machine values) from the file object f and append them to the end of the array. If less than n items are available,
EOFError
is raised, but the items that were available are still inserted into the array. f must be a real built-in file object; something else with aread()
method won’t do.
-
array.
fromlist
(list)¶ 添加来自 list 的项。 这等价于
for x in list: a.append(x)
,区别在于如果发生类型错误,数组将不会被改变。
-
array.
fromstring
(s)¶ 添加来自字符串的项,将字符串解读为机器值的数组(相当于使用
fromfile()
方法从文件中读取数据)。
-
array.
fromunicode
(s)¶ Extends this array with data from the given unicode string. The array must be a type
'u'
array; otherwise aValueError
is raised. Usearray.fromstring(unicodestring.encode(enc))
to append Unicode data to an array of some other type.
-
array.
index
(x)¶ 返回最小的 i 使得 i 为 x 在数组中首次出现的序号。
-
array.
insert
(i, x)¶ 将值 x 作为新项插入数组的 i 位置之前。 负值将被视为相对于数组末尾的位置。
-
array.
pop
([i])¶ 从数组中移除序号为 i 的项并将其返回。 可选参数值默认为
-1
,因此默认将移除并返回末尾项。
-
array.
read
(f, n)¶ 1.5.1 版后已移除: Use the
fromfile()
method.Read n items (as machine values) from the file object f and append them to the end of the array. If less than n items are available,
EOFError
is raised, but the items that were available are still inserted into the array. f must be a real built-in file object; something else with aread()
method won’t do.
-
array.
remove
(x)¶ 从数组中移除首次出现的 x。
-
array.
reverse
()¶ 反转数组中各项的顺序。
-
array.
tofile
(f)¶ Write all items (as machine values) to the file object f.
-
array.
tolist
()¶ 将数组转换为包含相同项的普通列表。
-
array.
tostring
()¶ Convert the array to an array of machine values and return the string representation (the same sequence of bytes that would be written to a file by the
tofile()
method.)
-
array.
tounicode
()¶ Convert the array to a unicode string. The array must be a type
'u'
array; otherwise aValueError
is raised. Usearray.tostring().decode(enc)
to obtain a unicode string from an array of some other type.
-
array.
write
(f)¶ 1.5.1 版后已移除: Use the
tofile()
method.Write all items (as machine values) to the file object f.
When an array object is printed or converted to a string, it is represented as
array(typecode, initializer)
. The initializer is omitted if the array is
empty, otherwise it is a string if the typecode is 'c'
, otherwise it is a
list of numbers. The string is guaranteed to be able to be converted back to an
array with the same type and value using eval()
, so long as the
array
class has been imported using from array import array
.
Examples:
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])
参见
- 模块
struct
打包和解包异构二进制数据。
- 模块
xdrlib
打包和解包用于某些远程过程调用系统的 External Data Representation (XDR) 数据。
- The Numerical Python Documentation
Numeric Python 扩展 (NumPy) 定义了另一种数组类型;请访问 http://www.numpy.org/ 了解有关 Numerical Python 的更多信息。