Python之父:為什么Python的索引從零開始?

jopen 8年前發布 | 19K 次閱讀 Python

剛開始學習Python語言的時候,并不是很理解為什么Python列表的索引值是從0開始的,不過卻很喜歡列表切片的語法,非常簡單、優雅。而最近在翻閱Python之父Guido老爹的Google+發文時,看到了他自己對這個問題的解釋。

下面是Guido老爹的回答。

最近有人在推ter上問我,為什么Python中的索引從0開始(0-based indexing),還提供了一篇關于這個話題的 文章鏈接 (文章寫的很有趣)。我記得自己就這個問題思考過很久;Python的祖先之一ABC語言,使用的索引是從1開始的(1-based indexing),而對Python語言有巨大影響的另一門語言,C語言的索引則是從0開始的。我最早學習的幾種編程語言(Algol, Fortran, Pascal)中的索引方式,有的是1-based的,有的是從定義的某個變量開始(variable-based indexing)。而我決定在Python中使用0-based索引方式的一個原因,就是切片語法(slice notation)。

讓我們來先看看切片的用法。可能最常見的用法,就是“取前n位元素”或“從第i位索引起,取后n位元素”(前一種用法,實際上是i==起始位的特殊用法)。如果這兩種用法實現時可以不在表達式中出現難看的+1或-1,那將會非常的優雅。

使用0-based的索引方式、半開區間切片和缺省匹配區間的話(Python最終采用這樣的方式),上面兩種情形的切片語法就變得非常漂亮:a[:n]和a[i:i+n],前者是a[0:n]的縮略寫法。

如果使用1-based的索引方式,那么,想讓a[:n]表達“取前n個元素”的意思,你要么使用閉合區間切片語法,要么在切片語法中使用切片起始位和切片長度作為切片參數。半開區間切片語法如果和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索引方式是從零開始的。

原文鏈接:https://plus.google.com/115212051037621986145/posts/YTUxbXYZyfi

相關鏈接:http://c2.com/cgi/wiki?ZeroAndOneBasedIndexes

End

歡迎大家掃描下方二維碼關注我的公眾號“編程派”,謝謝支持!

Python之父:為什么Python的索引從零開始?

來自: http://www.codingpy.com/article/guido-explains-why-python-uses-zero-based-indexing/

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!