2.7. Listy¶
Lista to zmienna, uporządkowana sekwencja wartości. W odróżnieniu od łańcuchów znaków i bajtów listy mogą przechowywać wartości dowolnych typów, a elementy można w miejscu zmieniać, dodawać i usuwać.
2.7.1. Tworzenie list¶
Nawiasy kwadratowe tworzą literał listy:
empty = []
nums = [1, 2, 3]
mixed = [1, "two", 3.0, True, None] # any types
nested = [[1, 2], [3, 4], [5, 6]] # lists of lists
Konstruktor list buduje listę z dowolnego obiektu iterowalnego:
>>> list("abc")
['a', 'b', 'c']
>>> list(range(5))
[0, 1, 2, 3, 4]
2.7.2. Długość, indeksowanie i wycinanie¶
len() zwraca liczbę elementów. Indeksowanie i wycinanie działają tak samo jak w łańcuchach znaków – pozycje zaczynają się od 0, indeksy ujemne liczone są od końca, a wycinek wykraczający poza dopuszczalny zakres jest po cichu przycinany, zamiast zgłaszać błąd:
>>> nums = [10, 20, 30, 40, 50]
>>> len(nums)
5
>>> nums[0]
10
>>> nums[-1]
50
>>> nums[1:4]
[20, 30, 40]
Indeksy dodatnie liczone są od początku; indeksy ujemne od końca.¶
Składnia wycinka to skrót dla obiektu slice, który Python buduje za kulisami. nums[1:4] to to samo, co nums[slice(1, 4)]. Rzadko konstruuje się go ręcznie, ale slice() bywa przydatne do przechowywania wycinka jako wartości do ponownego użycia:
head = slice(0, 3)
print(nums[head]) # [10, 20, 30]
print(letters[head]) # first three letters, same slice
2.7.3. Modyfikowanie listy¶
Listy obsługują przypisanie w miejscu z indeksem i z wycinkiem:
>>> nums = [10, 20, 30]
>>> nums[0] = 99
>>> nums
[99, 20, 30]
>>> nums[1:3] = [200, 300, 400] # slice can change the length
>>> nums
[99, 200, 300, 400]
Najczęściej używane metody list:
list.append()– dodaje pojedynczy element na koniec.list.extend()– dołącza każdy element z obiektu iterowalnego.list.insert()– wstawia na podanej pozycji.list.remove()– usuwa pierwsze wystąpienie wartości.list.pop()– usuwa i zwraca element (domyślnie ostatni).list.clear()– usuwa wszystkie elementy.list.sort()– sortuje w miejscu. Przekażreverse=Truedla porządku malejącego.list.reverse()– odwraca w miejscu.
>>> nums = []
>>> nums.append(1)
>>> nums.extend([2, 3])
>>> nums.insert(0, 99)
>>> nums
[99, 1, 2, 3]
>>> nums.pop()
3
>>> nums.sort()
>>> nums
[1, 2, 99]
Metody te modyfikują listę w miejscu i zwracają None. Zapis
nums = nums.sort() # nums is now None -- common bug
prawie nigdy nie jest tym, czego chcesz; oryginalna nums została posortowana, ale przypisanie nadpisuje następnie nazwę zwróconą wartością. Albo wywołaj nums.sort() w osobnym wierszu, albo użyj wbudowanej funkcji sorted(), aby otrzymać nową posortowaną listę bez modyfikowania oryginału.
2.7.4. Operatory¶
+łączy dwie listy w nową listę.*powiela listę.insprawdza przynależność.
>>> [1, 2] + [3, 4]
[1, 2, 3, 4]
>>> [0] * 5
[0, 0, 0, 0, 0]
>>> 3 in [1, 2, 3]
True
2.7.5. Iterowanie po liście¶
Pętla for przechodzi przez elementy w kolejności:
for n in [10, 20, 30]:
print(n)
2.7.6. Aliasowanie i modyfikacja¶
Lista jest pojedynczą wartością w pamięci; kilka nazw może wskazywać na tę samą listę. Modyfikacja przez jedną nazwę jest widoczna przez każdą inną nazwę wskazującą na tę samą listę.
a i b wskazują na tę samą listę. Modyfikacja przez którąkolwiek nazwę zmienia to, co widzi każda inna nazwa.¶
>>> a = [1, 2, 3]
>>> b = a
>>> a.append(4)
>>> b
[1, 2, 3, 4] # same object, change is visible
Aby utworzyć niezależną kopię, wytnij całą listę lub wywołaj konstruktor list:
>>> c = a[:] # or list(a)
>>> a.append(5)
>>> c
[1, 2, 3, 4] # c is unaffected
Kopiuje to tylko listę najwyższego poziomu; zagnieżdżone listy są nadal współdzielone między oryginałem a kopią.