Python數組從0開始,這是為什麼呢?Python之父Guido van Rossum是這麼解釋的:
最近有人在Twitter是問我為什麼Python使用以0為第一位的數組索引方式(以下簡稱0-based),并讓我看一篇關于這個主題的文章(很有趣)。這引起了我不少的回憶。ABC語言——Python的祖先之一,使用的是以1為第一位的索引方式(以下簡稱1-based),而C語言——另一種對Python有影響巨大的語言,使用0-based方式。我最早學習的幾種語言(Algol, Fortran, Pascal),有的是1-based的,有的是不固定的。我認為,之是以讓我決定讓Python使用0-based索引方式的原因之一是Python的切片(slice)文法。
讓我們來先看看切片的用法。可能最常見的用法就是“從數組中切出前n位”或“從數值這第i位起切出n位”(前一種實際上是
i==起始位
的特殊用法)。如果使用這種文法時不需要表達成難看的+1或-1補充方式,那将是非常的優雅。
使用0-based的索引方式,Python的半開區間切片和預設比對區間切片文法變得非常漂亮:
a[:n]
和
a[i:i+n]
,前者的标準寫法就是
a[0:n]
。
如果是1-base的索引方式,那麼,想讓
a[:n]
表達成“取前n個元素”,(這是不行的),你要麼使用一個閉合區間切片文法,要麼在切片文法中使用切片起始位和切片長度2個參數的形式。使用1-based索引方式,半開區間切片文法變得不優雅。這種方式下使用閉合區間切片文法,為了表達從第i位取n個元素時你必須寫出
a[i:i+n-1]
。這樣看來,如果使用1-based的索引,使用切片起始位+長度的形式更合适。這樣你可以寫成
a[i:n]
。事實上ABC語言就是這樣做的——它使用了一個獨特的表達方式,寫成a@i|n。(參看
http://homepages.cwi.nl/~steven/abc/qr.html#EXPRESSIONS但是,
index:length
這種方式在其它情況下适用嗎?說實話,這點我有些記不清了,但我想我是被半開區間文法的優雅迷住了。特别是當兩個切片操作位置鄰接時,第一個切片操作的終點索引值是第二個切片的起點索引值時,太漂亮了,無法舍棄。例如,你想将一個數組以i,j兩個點切成三部分——這三部分将會是
a[:i]
,
a[i:j]
a[j:]
這就是為什麼我要讓Python使用0-based的索引方式的原因。