Jedną z pierwszych informacji jaką poznajemy w kontekście krotki (eng. tuple) jest fakt, że krotka w odróżnieniu od listy należy do typów niemodyfikowalnych.

To prawda, ale warto podkreślić w tym miejscu również to, że zastosowanie obu kolekcji jest odmienne.

Lista jest jednorodna (eng. homogeneous), co oznacza, że wszystkie jej elementy są tego samego typu. Natomiast krotka jest niejednorodna (eng. heterogeneous) więc jej elementy mogą być różnego typu.

Może się wydawać, że ta różnica nie ma większego znaczenia, ponieważ Python jest dynamicznie typowanym językiem co oznacza, że można tworzyć w nim zarówno krotki jak i listy z wartościami różnych typów.

Sytuacja się zmienia, gdy obie kolekcje zaczniemy analizować z perspektywy stosowanych adnotacji.

Poniższa funkcja przyjmuje listę, której wszystkie elementy są typu int. Przekazana lista może mieć dowolną liczbę wartości:

def foo(values: List[int]):
    ...

Zapis typu krotki nie jest już taki zwięzły, ponieważ dla każdego jej elementu trzeba osobno określić typ:

def foo(values: Tuple[int, int, int]):
    ...


Wybór krotki jest zasadny w sytuacji, gdy funkcja zwraca zestawienie danych o różnych typach. Funkcja enumerate i funkcja zip dobrze obrazują powyższy przypadek:

>>> list(enumerate('abcd'))
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

>>> list(zip('abcd', range(4))) 
[('a', 0), ('b', 1), ('c', 2), ('d', 3)]