Miért célszerű, ha homogén elemű egy lista, és miért lehet heterogén elemű egy tuple konténer?

A Pythonban egy lista, vagyis egy list típusú konténer eleme elvben bármilyen objektum lehet. A lista változtatható konténer, ami azt jelenti, hogy a program futása közben az elemei kicserélhetők, valamint elemszáma növelhető és csökkenthető.

Ezzel szemben egy tuple nem változtatható konténer, ezért egy adott példányának létrehozása után annak elemei nem cserélhetők, és elemszáma nem növelhető vagy csökkenthető.

Bár az elemeknek nem kötelező azonos típusúaknak lenni egy listában, de a változtathatóság miatt célszerű, ha a lista homogén elemkészlettel rendelkezik. Ekkor ugyanis a lista elemekkel való növelése, csökkentése, vagy az elemek cseréje után, az egyes elemek használatakor nem szükséges azokat egyenként ellenőrizni, hiszen bízhatunk abban, hogy egy végzendő művelethez fontos jellemzővel minden indexpozícióban minden egyes elem rendelkezik. Ezt értjük azon, hogy az elemek homogének.

Erre mutat példát a következő kódsor, ahol egy függvény egy listát fogad. Ennek elemein úgy halad végig, hogy az első elem értékéhez 1-et ad, és kiírja az eredményt. Ezt követően ezt az első elemet eltávolítjuk. Az eljárást mindaddig folytatjuk, amíg van elem a listában.

Ebben az esetben az elemhomogenitás azt jelenti, hogy az elemek rendelkeznek azzal a tulajdonsággal, hogy mindegyikükhöz hozzáadható az 1 érték. Ahhoz, hogy a függvény e definícióval hiba nélkül működjön, erre a homogén jellemzőre szükség van, mert az összeadás egyik tagja, vagyis az első pozícióban (0. index) levő elem mindig más lesz.

Minthogy a tuple változtathatatlan konténer, ezért nem lehet az elemeken vagy azok indexpozícióján változtatni, így nem áll fenn a kockázata annak, hogy adott indexpozícióba más jellemzőkkel rendelkező elem kerüljön, mint ami a létrehozáskor volt. Ezért a tuple elemei lehetnek heterogének is, mert adott indexnél levő elem mindig ugyanaz marad, és így előre tervezhető módon dolgozható fel.

Amikor homogén jellemzőkkel bíró elemeket említettünk, szándékosan nem azonos típusúakat írtunk. Ugyanis a feldolgozásakor egy vagy több előre tervezett adat- vagy metódusattribútumát akarjuk használni az elemeknek. Ehhez pedig nem feltétlenül szükséges az azonos típus. Például az int és float eltérű típusúak, de mindegyik rendelkezik a real és imag adatattribútumokkal, valamint az as_integer_ratio() metódussal. Ezért, ha ezen attribútumokat akarjuk használni, akkor egy listában egyaránt szerepelhet int és float is.

Kicsit más lesz a helyzet, ha egy listát fogadó változót (vagy akár függvény paramétert és visszatérési értéket) úgy annotálunk, hogy jelölni akarjuk az elemek típusát is. Ebben az esetben a list[] annotációnál a szögletes zárójelek között típusnevet kell megadnunk, viszont ebből csak egyet lehet, minthogy ilyekor az elemek homogenitását egy adott típus biztosítja. Ha például a képen látható annotált_lista változót annotációval akarjuk ilyen módon ellátni, akkor a típusutalás vagy list[int] vagy list[float] lehet. Ezért, ha egy int elemeket tartalmazó listát egy float elemeket tartalmazóval összefűzünk és az annotált_lista változóhoz rendeljük, akkor egy statikus típusellenőrző (pl. a mypy) hibát fog jelezni annak ellenére, hogy az eltérő típusú elemek feldolgozása nem okozna gondot.

E témával részleteiben a Python tudásépítés lépésről lépésre című e-könyv „Típusutalások generikus típusokkal” fejezete foglalkozik.

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.