目錄
一、切片?
二、遍歷切片
三、列表的復制
一、切片?
? ? ? ?此前,我們學習了如何訪問單個列表以及如何處理列表中的所有元素,那么我們如何處理列表中的部分元素呢?這就引出一個概念“切片”?。我們可以把列表看成是面包,“切片”就是要找出你最鐘意的那部分進行處理(吃掉)。如此一來,這最鐘意的部分一定有起點和終點。而且需要注意的是選擇“切片”的全程是你告訴計算機這個傻瓜的,所以你需要指明“起點”和“終點”的下標。我讀的這本書中,將下標寫作為“索引”。說下標是為了和C語言做對比。
“切片”的語法規則:
#made by Jeffery
#10.19
players=['charles','martina','michael','florence','eli','jeffery'] #先構建一個運動員列表
print(players[1:5]) #print函數中的“players[1:5]”即是切片,表示輸出列表中第2個元素到第5個元素
? ? ? ?這里舉例,如果你想把列表中第2個元素到第5個元素組成的部分切出來,那么你的下標就應該是1——5,我們用一段代碼舉例說明:
#made by Jeffery
#10.19
players=['charles','martina','michael','florence','eli','jeffery'] #構建一個運動員列表
print(players[1:5]) #輸出列表中第2個元素到第5個元素
? ? ? ?通過上面這個例子,我們應該再次清醒的認識到,機器語言中是從“0”開始的?!而我們計數第幾個是從“1”開始的,所以第2個元素(人)對應的下標應該就是“1”(機器),第5個元素(人)對應的下表應該就是“4”(機器),但為啥在代碼中是“5”呢?這是因為切片的終點和range()函數的末尾參數一樣:都是到我們指定的終點下標的前一位停止的。我們指明切片的起點和終點后,就可以取出列表中的任一片段進行分析了。
? ? ? ?假如我們沒有指明切片起點、終點中的任意一點,將會發生什么?(沒有指明指的是沒有數字,而不是“0”切記)?
#made by Jeffery
#10.19
players=['charles','martina','michael','florence','eli','jeffery'] #先構建一個運動員列表
print("未指明起點的切片結果:")
print(players[:5]) #未指明起點
print("未指明終點的切片結果:")
print(players[1:]) #未指明終點
?
從實驗結果得出:切片->未指明起點,從列表起點“起”;未指明終點,至列表終點“終”。
?有人問,那要是切片的兩個點(終點、起點)都沒指明,那將會出現什么結果?起點沒有,終點沒有,那就是整個列表了,這種情況我也在下面的文章也有提到。除了上述介紹的三種切片的方法(1、有起點、終點;2、無起點、有終點;3、有起點、無終點),還有另外一種方法,就是之前學的“負數索引”,例如:
#made by Jeffery
#10.19
players=['charles','martina','michael','florence','eli','jeffery'] #先構建一個運動員列表
print(players[-3:]) #切出列表后三個元素
上述代碼中使用“-3”下標成功切出列表后三個元素的切片!這一方法使得無論列表多長,我們都可以直接切出從“特定位置”開始,到列表末尾的切片。舉一反三,如果我們的終點下標用負數,例如“-3”,就是切除列表頭前3個元素的切片。切片說到這里還有一個注意的地方就是:要用“:”(冒號)分割起點和終點下標。
二、遍歷切片
“遍歷”就是都走一遍,都經歷一遍,。那么,我們既然前面學了切片,那就直接用循環對切片進行遍歷即可,這里有兩種方法:
1、 先切片,后遍歷。
#made by Jeffery
#10.19
players=['charles','martina','michael','florence','eli','jeffery'] #先構建一個運動員列表
players_2=players[0:3] #切出一個列表
for player in players_2: #對剛切出的列表進行循環、遍歷print(player) #遍歷的同時輸出
?
2、切片與遍歷“同時進行”
#made by Jeffery
#10.19
players=['charles','martina','michael','florence','eli','jeffery'] #先構建一個運動員列表
for player in players[0:3]: #直接指明切片的起點和終點,并進行輸出。print(player)
?這兩種方法我覺得在結果上沒什么區別,前者多使用了變量,后者是書中給出的標準用法。切片有以下幾種使用情形:可以使用切片對數據進行批量處理;編寫Web應用程序時可以使用切片來分頁顯示信息。
三、列表的復制
? ? ? 列表的復制就是創建一個包含整個列表的切片,即不規定切片的起點和終點,有的同學就提問了,我不能直接把a列表賦值給b列表嗎?我們接下來會用實際代碼舉例說明。
1、列表的復制
#made by Jeffery
#10.19
players=['charles','martina','michael','florence','eli','jeffery'] #先構建一個運動員列表
players_1=players[:]
print("原列表為:",players)
print("復制形成的列表為:",players_1)
?
從控制臺的顯示結果可以看出,我們確實通過切片復制、創建了一個新的列表,但這會不會就是同一個列表?(內存存儲地址一致,只是分開顯示了兩次)?我們通過接下來的代碼對其進行測試,看這兩個列表在內存中是不是分開存儲的?我們分別向這倆列表追加兩個不同的元素,看其結果。
#made by Jeffery
#10.19
players=['charles','martina','michael','florence','eli','jeffery'] #先構建一個運動員列表
players_1=players[:]
players_1.append("jack") #分別向這兩個列表追加不同的元素(人名)再看結果
players.append("black")
print("原列表為:",players)
print("復制形成的列表為:",players_1)
實驗證明,我們確實通過切片形成了一個新的列表:列表中的最后一個元素正如我們分別追加的兩個元素,沒有同時出現。
那么,我們現在來驗證那位同學的猜想,是否可以通過直接賦值的方式來達到復制例表的目的?
#made by Jeffery
#10.19
players=['charles','martina','michael','florence','eli','jeffery'] #先構建一個運動員列表
players_1=players
print("原列表為:",players)
print("復制形成的列表為:",players_1)
目前看一切正常,那么我們使用同樣的方法:向這兩個列表追加兩個不同的元素。
#made by Jeffery
#10.19
players=['charles','martina','michael','florence','eli','jeffery'] #先構建一個運動員列表
players_1=players
players.append("jack") #向這兩個列表分別追加不同的元素
players_1.append("black")
print("原列表為:",players)
print("復制形成的列表為:",players_1)
?
結果顯而易見,兩個列表中同時出現了追加的兩個元素,這就表明不能通過簡單的“賦值”達到復制列表的效果!?
這么做行不通的解釋是:單純“賦值”,其實還是將兩個列表的內容關聯到一起,因此這兩個列表其實指向的還是同一個列表,所以才出現了兩個列表在追加兩個不同元素后,兩個不同元素同時出現在兩個列表里的結果。所以,在使用列表的副本時,還是老老實實的去“切片”。(這里的操作結果,不同于C語言,注意區別。)?