Wyjaśnienie lekcji
Po tej lekcji będziesz potrafić:
start:stop, pamiętając, że stop jest wyłączne.[:] lub .copy() przed zmianą jej elementów.Wycinek (slice) wybiera kilka elementów bez ręcznego indeksowania każdego z nich. W items[start:stop] element start jest uwzględniony, a stop nie. Na przykład items[1:4] zwraca elementy o indeksach 1, 2 i 3.
Wycinek może pomijać dowolną z granic: items[:3] bierze pierwsze trzy elementy, a items[2:] bierze wszystko od indeksu 2. Granice ujemne liczą od końca, tak jak w poprzedniej lekcji. items[::2] bierze co drugi element za pomocą dodatniego kroku (step). W odróżnieniu od indeksowania, wycinek, którego koniec wykracza poza długość listy, po prostu zatrzymuje się na dostępnych elementach.
Kopiowanie ma znaczenie, gdy dane są modyfikowalne. candidate = baseline nie tworzy nowej listy; obie nazwy odnoszą się do tego samego obiektu. Natomiast candidate = baseline[:] lub candidate = baseline.copy() tworzy nową zewnętrzną listę. Zaktualizowanie elementu najwyższego poziomu w kopii nie zmieni oryginału.
To są kopie płytkie (shallow copies): jeśli lista zawiera modyfikowalne obiekty zagnieżdżone, te obiekty nadal są współdzielone. Głębsze struktury omówimy później.
Pozycja końcowa nie jest uwzględniona.
stages = ["fetch", "build", "test", "package", "deploy"]
print(stages[1:4])Wynik:
['build', 'test', 'package']Element o indeksie 4 jest pominięty.
Pominięcie początku lub końca ułatwia wybieranie elementów z obu końców.
regions = ["eu", "us", "apac", "sa", "ca"]
print(regions[:2])
print(regions[-2:])Wynik:
['eu', 'us']
['sa', 'ca']Ujemny początek wybiera dwa ostatnie elementy.
Trzecia wartość wycinka określa, jak daleko przesuwać się między wybranymi elementami.
readings = [8, 9, 10, 11, 12, 13]
print(readings[::2])Wynik:
[8, 10, 12]Wybór zaczyna się od pierwszego elementu i posuwa się o dwa.
Kopia wykonana wycinkiem daje nową listę, którą można aktualizować niezależnie.
baseline = ["queued", "running", "done"]
preview = baseline[:]
preview[1] = "paused"
print(baseline)
print(preview)Wynik:
['queued', 'running', 'done']
['queued', 'paused', 'done']baseline się nie zmienia. Wywołanie baseline.copy() to inny sposób wykonania takiej kopii.
| Potrzeba | Składnia |
|---|---|
Wzięcie od początku do stop - 1 | items[:stop] |
Wzięcie od start do końca | items[start:] |
| Wzięcie środkowego okna | items[start:stop] |
| Wzięcie co drugiego elementu | items[::2] |
| Skopiowanie zewnętrznej listy | items[:] lub items.copy() |
| Utworzenie kolejnej nazwy dla tej samej listy | alias = items |
IndexError: bezpiecznie zwraca dostępną część.candidate = baseline jako kopii: obie nazwy wskazują wtedy tę samą listę.[:] i .copy() kopiują tylko zewnętrzną listę.