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