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]
Lista sześciu komórek, z indeksami dodatnimi 0..5 nad każdą komórką i indeksami ujemnymi -6..-1 pod każdą z nich.

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:

>>> 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ę.

  • in sprawdza 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ę.

Dwie zmienne, a i b, wskazują na ten sam obiekt listy; dołączenie do a jest widoczne przez b.

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ą.