Python 索引、切片(奇怪為什麼是這樣呢???)
阿新 • • 發佈:2022-03-16
相信即使是Python新手也很容易理解下面的切片行為:
那麼,下面的呢?
擴充套件切片語法如下:
s[begin : end : stride]
與簡單切片語法相比,擴充套件切片只是增加了第3個引數,即步長引數(英文資料中通常稱為"stride"或"step")。
擴充套件切片語法引入的"stride"引數是個需要特別注意的引數,因為它的正/負取值將會影響切片操作對源序列s的訪問方向,而這正是本文開始那幾個示例可能引起Python新手困惑的原因。
其實規則很簡單,說穿了給我兩個關注:
1) 當stride引數為正值(positive)時,表明切片操作從左至右(即正向)訪問源序列s的元素,此時,若begin和end引數有預設,則Python直譯器預設將其設定為None。如s[0 : : 1]會被直譯器當作s[0 : None : 1],此時,end實際取值要大於其有效索引範圍的上限值,以保證切片操作能訪問到源序列s從begin開始的所有元素(從左向右)。
2) 當stride引數為負值(negative)時,表明切片操作從右至左(即逆向)訪問源序列s的元素,此時,若begin和end引數有預設,則Python直譯器預設將其設定為None。如s[-1 : : -1]會被直譯器當作s[-1 : None : -1],此時,end實際取值要小於其有效索引範圍的下限值,已保證切片操作能訪問到源序列s從begin開始的所有元素(逆向,從右向左)。
3) 無論stride引數取正值還是負值,切片表示式的begin和end索引值需要保證在切片操作的訪問方向上,從begin到end之間有元素,這樣切片操作才能保證返回非空集。