List vs. Array
在學習資料結構時,array 是最基礎且最常見的資料結構之一,這種資料結構專門用來儲存多個「有順序性」且「相同型別」的資料。但在接觸 Python 時,你會發現最常被拿來儲存多個有序性資料的資料結構叫做 list,不是 array,有些人會誤以為 Python 的 list 就是 array,只是換個名字而已,但其實不是!
Python 中其實有 array 這種資料型別,而且它就叫 array,只是這種「傳統的」array 沒有 list 那麼靈活好用,所以大家沒那麼愛用就是了。
Array
[!Note] 官方文件https://docs.python.org/3.14/library/array.html
Python Array 的特色
一個 array 型別的變數被定義時,就要決定這個 array 的大小,且這個大小不能再被改變。
Array 在 memory 中是一塊連續的區塊。
一個 array 中的所有元素都必須是相同的資料型別,比如 integer array、string array... 等。
Array 只能是一維,無法構造 nested array。(但
numpy
中的 ndarray 就可以是多維的)。
使用
Array 並不在 Python 的 standard library 中,所以須要額外 import:
from array import array
a = array("i", [1, 2, 3])
array
constructor 的第一個參數是 "typecode",定義如下表:
"b"
signed char
int
1
"B"
unsigned char
int
1
"u"
wchar_t
Unicode character
2
Depreciated
"h"
signed short
int
2
"H"
unsigned short
int
2
"i"
signed int
int
2
"I"
unsigned int
int
2
"l"
signed long
int
4
"L"
unsigned long
int
4
"q"
signed long long
int
8
"Q"
unsigned long long
int
8
"f"
float
float
4
"d"
double
float
8
List
Python List 的特色
一個 list 的大小隨著內含的元素數量而改變,並非固定。
List 和 array 一樣,在 memory 中的位置也是連續的,但和 array 不一樣的是,==list 在這塊連續空間中存放的只是實際資料的 reference (pointer)==,實際資料是隨機分散在 memory 中的(即使是 primitive data type 也是)。
一個 list 中的各個元素可以是不同的資料型別。
List 可以定義 nested list。
可以用 negative index 來指定 list 中的元素。
觀念澄清
看完以上比較後,你可能會有以下兩個錯覺:
「既然 list 的功能比 array 還彈性,那 list 應該是基於 array 實作的。」
事實恰好像反!==在 Python 中,array 才是基於 list 實作的==,所以建立一個 list 的時間會比建立一個 array 還要快。
「Array 看起來好沒用,在各方面都不如 list。」
確實這也是為什麼你很少看到有人在 Python 中用 array,但 array 其實也不是什麼都不如 list,當你須要把兩個相同長度的 integer arrays 的同位數相互做四則運算時,用 array 會比用 list 還要快。
此外,因為 array 是把實際的值存在連續空間中,而不是額外用一個連續空間來存 references,所以同一串資料放進 array 會比放進 list 還要省空間。
Last updated