為什麼 Python 中的串列被稱為「串列」(List)而不是「陣列」(Array)
更新日期: 2024 年 11 月 16 日
在 Python 中,序列型資料結構中的「串列」(List)與 JavaScript 的「陣列」(Array)有類似功能,但名稱和設計理念卻截然不同。
Python 的設計者,有意將串列與嚴格定義的陣列區分開來,並保留陣列作為另一種數據結構。
本文將探討這一命名背後的原因,並解釋陣列和串列在設計上的差異。
為什麼 Python 中稱為串列而非陣列
Python 設計者選擇使用「串列」這一名稱,是為了避免與嚴格定義的「陣列」混淆。
以下是兩者名稱不同的主要原因:
嚴格類型限制的考量
在傳統的程式語言(如 C 或 Java)中,陣列(Array)是一種必須包含「相同數據類型」元素的數據結構。
例如,整數陣列中只能包含整數,浮點數陣列中只能包含浮點數。
範例:不允許混合型態的陣列
int arr[3] = {1, 2, 3}; // 合法
int arr[3] = {1, 2, "hello"}; // 非法
這樣的限制來自於陣列的記憶體布局。
陣列內部是連續的記憶體區塊,每個元素的大小由數據類型(如整數、浮點數)決定。
如果數據類型不同,記憶體的偏移值無法確定,會導致計算錯誤。
在 Python 中,串列允許包含任意類型的元素,例如:
a = [1, 2, 3, "你好", "s"]
這種設計讓串列更靈活,但也失去了陣列的記憶體緊湊性和訪問效率。
因此,Python 設計者選擇「串列」這一名稱,表明它與傳統陣列不同。
記憶體偏移的影響
陣列的記憶體布局,依賴於每個元素的固定寬度。
當我們通過索引訪問陣列元素時,底層實際上是計算記憶體地址:
a[n] = 起始地址 + 偏移值 * n
- 起始地址:陣列的第一個元素的記憶體地址。
- 偏移值:由陣列中單個元素的記憶體寬度(例如整數的 4 字節)決定。
- n:索引值。
如果陣列中包含不同類型的元素,偏移值會不一致,記憶體計算將無法正確進行。
因此,傳統陣列需要統一的數據類型。
Python 的串列則不同,它使用指針指向每個元素,而非依賴固定的偏移值,因此能存放不同類型的數據,但訪問效率略低於陣列。
Python 已有陣列數據結構
Python 中除了串列外,還有專門的「陣列」(array
模組)。
陣列在設計上更接近傳統語言中的陣列:它只允許存儲相同類型的數據,並提供更高效的記憶體管理。
範例:使用 array
模組
import array
arr = array.array('i', [1, 2, 3]) # 'i' 表示整數
print(arr) # 輸出 array('i', [1, 2, 3])
array
模組補足了串列在性能和類型一致性上的不足,因此 Python 不需要將串列命名為陣列。
結語
Python 中的「串列」與傳統語言中的「陣列」在設計理念上有顯著不同。
Python 串列的靈活性使其可以存儲多種數據類型,但也因此不具備傳統陣列的高效記憶體結構。
Python 設計者通過這一命名,清楚地區分了兩者的功能和特性。
此外,Python 還提供了專用的 array
模組,滿足需要高效陣列操作的場景。
理解這些設計差異,能幫助我們在程式開發中選擇更合適的數據結構。