讀古今文學網 > 父與子的編程之旅:與小卡特一起學Python > 12.7 列表「分片」 >

12.7 列表「分片」

還可以使用索引從列表一次獲取多個元素。這叫做列表分片(slicing)。

>>> print letters[1:4]['b', 'c', 'd']  

for 循環中的 range 類似,分片獲取元素時,會從第一個索引開始,不過在達到第二個索引之前停止。正是因為這個原因,前面的例子中我們只取回 3 項,而不是 4 項。要記住這一點,一種方法就是牢記取回的項數總是兩個索引數之差(4 - 1 = 3,所以取回 3 項)。

關於列表分片,還有一個重要的問題需要記住:對列表分片時取回的是另一個(通常更小的)列表。這個更小的列表稱為原列表的一個分片(slice)。原來的列表並沒有改變。這個分片是原列表的部分副本(copy)。

下面來看這有什麼不同:

>>> print letters[1]b>>> print letters[1:2]['b']  

在第一種情況下,我們取回一個元素。在第二種情況下,取回的是包含這個元素的一個列表。這個差別很微妙,但是你必須知道。在第一種情況下,我們使用了一個索引從列表得到一個元素。第二種情況下則是使用分片記法來得到列表的一個單元素分片(只包含一個元素的分片)。

要真正瞭解二者的區別,可以試試這些命令:

>>> print type(letters[1])<type 'str'>>>> print type(letters[1:2])<type 'list'>  

這裡分別顯示了兩個結果的類型(type),從中可以清楚地看出,前一種情況下得到了一個元素(這裡是一個字符串),後一種情況下得到的是一個列表。

對列表分片時會得到一個較小的列表,這是原列表中元素的一個副本。這說明,可以修改這個分片,而原列表不會受到任何影響。

分片簡寫

使用分片時可以採用一些簡寫形式。即使採用這些簡寫,也不會減少太多鍵入。不過程序員總是很懶,所以他們會大量使用簡寫。我希望你知道這些簡寫是什麼,這樣當你在別人的代碼中看到這些簡寫時就能認出來,而且明白是什麼意思。這很重要,因為學習新的編程語言時(或者籠統地說,學習編程時),查看並且理解其他人的代碼是一種很好的方法。

如果你想要的分片包括列表的開始部分,簡寫方式是使用冒號,後面是想要的元素個數,例如:

>>> print letters[:2]['a', 'b']  

注意,冒號前面沒有數字。這樣就會得到從列表起始位置開始一直到(但不包括)指定索引之間的所有元素。

要得到列表末尾也可以用類似的記法。

>>> print letters[2:]['c', 'd', 'e']  

使用一個後面跟冒號的數,這樣可以得到從指定索引到列表末尾的所有元素。

如果沒有放入任何數,而只有冒號,就可以得到整個列表:

>>> print letters[:]['a', 'b', 'c', 'd', 'e']  

應該記得吧?我說過分片就是建立原列表的副本。所以 letters[:] 會建立整個列表的副本。如果你想對列表做些修改,但是同時還想保持原來的列表不做任何改變,使用這種分片就會很方便。