2.7. Seznamy

Seznam je měnitelná, uspořádaná posloupnost hodnot. Na rozdíl od řetězců a bytů mohou seznamy obsahovat hodnoty libovolného typu a položky můžete měnit, přidávat nebo odebírat na místě.

2.7.1. Vytváření seznamů

Hranaté závorky vytvoří literál seznamu:

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 vytvoří seznam z libovolného iterovatelného objektu:

>>> list("abc")
['a', 'b', 'c']
>>> list(range(5))
[0, 1, 2, 3, 4]

2.7.2. Délka, indexování a řezy

len() vrací počet položek. Indexování a řezy fungují stejně jako u řetězců – pozice začínají na 0, záporné indexy se počítají od konce a řez mimo platný rozsah se tiše ořízne, místo aby vyvolal chybu:

>>> nums = [10, 20, 30, 40, 50]
>>> len(nums)
5
>>> nums[0]
10
>>> nums[-1]
50
>>> nums[1:4]
[20, 30, 40]
Seznam šesti buněk s kladnými indexy 0..5 nad a zápornými indexy -6..-1 pod každou buňkou.

Kladné indexy se počítají od začátku; záporné indexy se počítají od konce.

Syntaxe řezu je zkratkou pro objekt slice, který Python vytváří v zákulisí. nums[1:4] je totéž co nums[slice(1, 4)]. Ručně jej vytváříte jen zřídka, ale slice() je občas užitečný pro uložení řezu jako hodnoty k opakovanému použití:

head = slice(0, 3)
print(nums[head])             # [10, 20, 30]
print(letters[head])          # first three letters, same slice

2.7.3. Mutace seznamu

Seznamy podporují indexované a řezové přiřazení na místě:

>>> 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]

Nejběžnější metody seznamu:

>>> 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]

Tyto metody upravují seznam na místě a vracejí None. Zápis

nums = nums.sort()    # nums is now None -- common bug

téměř nikdy není to, co chcete; původní nums byl seřazen, ale přiřazení poté přepíše jméno návratovou hodnotou. Buď zavolejte nums.sort() na samostatném řádku, nebo použijte vestavěnou funkci sorted(), která vrátí nový seřazený seznam, aniž by měnila původní.

2.7.4. Operátory

  • + spojí dva seznamy do nového seznamu.

  • * opakuje seznam.

  • in testuje členství.

>>> [1, 2] + [3, 4]
[1, 2, 3, 4]
>>> [0] * 5
[0, 0, 0, 0, 0]
>>> 3 in [1, 2, 3]
True

2.7.5. Iterování přes seznam

Smyčka for projde položky v pořadí:

for n in [10, 20, 30]:
    print(n)

2.7.6. Aliasování a mutace

Seznam je jediná hodnota v paměti; na stejný seznam může ukazovat několik jmen. Mutace přes jedno jméno je viditelná přes každé jiné jméno, které ukazuje na stejný seznam.

Dvě proměnné a a b obě ukazují na stejný objekt seznamu; připojení k a je viditelné přes b.

a a b obě ukazují na stejný seznam. Mutace přes kterékoli jméno změní to, co vidí každé jiné jméno.

>>> a = [1, 2, 3]
>>> b = a
>>> a.append(4)
>>> b
[1, 2, 3, 4]                # same object, change is visible

Chcete-li vytvořit nezávislou kopii, vytvořte řez celého seznamu nebo zavolejte konstruktor list:

>>> c = a[:]                # or list(a)
>>> a.append(5)
>>> c
[1, 2, 3, 4]                # c is unaffected

Toto zkopíruje pouze nejvyšší úroveň seznamu; vnořené seznamy jsou stále sdíleny mezi originálem a kopií.