初學Python,相較於之前所學的C/C++,其序列的索引和切片功能是第一個給人以幸福感的特性
- 既可以正向索引,0,1,2..., 也可以逆向索引,-1, -2, -3...
- 支持切片,其格式為[start : end: step],表示從start以step為步長直到end,但不包括end,start默認值為0,end默認值為到結束,step默認為1
然后,有一些初級小結論,比如:對於序列a = [1, 2, 3], a[ : : -1]可實現逆序,即[3, 2, 1]
這里我產生了一個疑惑,既然是a[ : : -1],由於沒有指定start, end,那么默認值為0和到結束,應該得到的是[ 1 ]才對呀 (我一直認為索引0對應的是序列第一個元素的位置)
於是,我查閱了Python官方文檔,得到如下解釋
您也可以這么理解切片:將索引視作指向字符 之間 ,第一個字符的左側標為0,最后一個字符的右側標為 n ,其中 n 是字符串長度。例如:
而我之前的理解,應該是這樣:
二者的區別在於索引標識位置不同。如果是索引,如a[0],a[2],a[-3],對應第二個圖,而對於切片,則應對應於第一個圖
進一步思考,為什么Python在序列切片中不采用和索引一樣的標識方式?而要以邊界為標識位置?
假設我們采用和索引一樣的切片的索引標識方式,即索引位置位於邊界,會有什么問題?
如果我們想從某一位置,切片到序列尾部,比如,我們想得到 'Python' 中的thon,采用這種方式,由於切片規則中不包含end標識的元素,因此我們將無法取到最后一個元素!最多只能取到 '0'
逆序同理。均是由於切片規則中舍棄末位元素導致的。那么,在這樣的切片方式上,如何改進,才能滿足我們的需求?
——那就是以元素邊界為標識位置,每一個元素都有左邊界和右邊界,如此,我們便可隨意切片取到我們想取的任何一個片段
最后,回到我們開頭的問題,對於序列a[::-1],可以實現將序列逆序就很顯然了