Tato kapitola by vás měla seznámit s datovým modelem Pythonu. Datový model je popis organizace dat, v tomto případě Pythonu. Je to spíš pokročilé téma o tom, jak interpret Pythonu uvnitř funguje. Znát tyto informace není nezbytně nutné, ale mohou vám pomoci pochopit jazyk Python a jak pracuje.
Python je objektově implementovaný. To znamená, že všechny data v něm jsou uložena jako objekty. Objekty jsou Pythoní abstrakce dat. Jako datové objekty jsou uloženy i základní datové entity jako čísla nebo řetězce. Tím se Python liší od řady klasických programovacích jazyků, kde tomu tak není. V souladu s von Neumannovou architekturou počítače je kód programu reprezentován také jako objekty. V důsledku tohoto jsou datové objekty například i funkce nebo třídy a můžeme s nimi zacházet jako s ostatními daty. To je ještě výjimečnější záležitost.
Poznámka: Python podporuje objektově orientované programování a tedy tvorbu objektů jako instancí tříd. Slovo objekt je tak přetíženo a má dva významy, mezi kterými je potřeba rozlišovat. Objekt jako instance třídy je zároveň datový objekt z pohledu organizace a uložení dat v Pythonu.
Každý datový objekt Pythonu má minimálně tři vlastnosti. Identitu, datový typ a hodnotu.
Identita datového objektu je jedinečný a neměnný identifikátor. To jest každý datový objekt má svůj vlastní a žádné dva objekty ho nemají shodný. Hodnota identifikátoru nelze změnit. V současné době je implementován jako adresa objektu v paměti, ale to se v budoucnu může změnit.
Identifikátor objektu lze zjistit pomocí funkce id().
>>> print id(10) 159591748
Identifikátor datového objektu představujícího číslo s hodnotou 10 je 159591748.
Na datové objekty mohou vést odkazy, kterým říkáme proměnné. Potřebujeme-li zjistit, zda dvě různé proměnné se odkazují na ten samý objekt, můžeme porovnat identifikátory objektu.
>>> print id(10) == id(10) True >>> print id(10) == id(20) False
To samé lze udělat pomocí operátoru is, který přesně k tomuto účelu slouží:
>>> print 10 is 10 True >>> print 10 is 20 False
Zdůrazňuji, že tímto zjišťujeme, zda se jedná o jeden a ten samý datový objekt (v paměti počítače), ne jestli mají stejnou hodnotu. Na jejich hodnotě nezáleží.
Datový typ je rovněž neměnitelný, ale není jedinečný. Můžeme mít v paměti spoustu datových objektů stejného datového typu. Datový typ specifikuje o jaký druh dat se přesně jedná. To jest jakých hodnot může datový objekt nabývat a jaké podporuje operace. Problematika datových typů je hodně široká a věnuje se jim vlastní kapitola.
Datový typ objektu lze zjistit funkcí type().
>>> print type(10) <type 'int'> >>> print type(20) <type 'int'> >>> print type("10") <type 'str'>
Datový typ datového objektu číslo s hodnotou 10 a 20 je int. Datový typ řetězce s hodnotou 10 je str.
Hodnota datového objektu jsou vlastní data objektu. Hodnoty jsou úzce svázány s datovým typem, který je obecně popisuje. Hodnota datového typu může být (v závislosti na datovém typu) měnitelná i neměnitelná. Neměnitelné jsou např. čísla, řetězce a vůbec základní datové entity. Měnitelné např. seznamy a slovníky. Některé datové objekty, které nazýváme kontejnery, místo vlastních hodnot obsahují odkazy na jiné datové objekty. To jsou například n-tice, seznamy nebo slovníky. Kontejnery mohou být měnitelné (seznam, slovník) i neměnitelné (n-tice). Neměnitelná n-tice se ale může odkazovat na měnitelný typ, jehož hodnotu lze měnit. Neměnitelnost kontejneru spočívá v tom, že ukazuje pořád na stejné datové objekty.
Datové objekty vznikají automaticky při práci s daty. Data mohou být uvedena ve formě literálů přímo ve zdrojovém kódu programu, nebo je můžeme během chodu programu načítat ze souboru, ze sítě, může je zadávat uživatel pomocí klávesnice a podobně. Z takto získaných dat poté můžeme v programu vytvářet nová. Cokoli s čím pracujeme se automaticky převádí na datové objekty, které jsou umístěny v paměti počítače.
Když datové objekty už nejsou potřeba, tak stejně automaticky zanikají. Tj. jsou odstraněny (vymazány) z paměti počítače. To že datové objekty již nejsou potřeba pozná interpret Pythonu podle toho, že se na ně neodkazují žádné proměnné nebo jiné datové objekty. Python rozpozná i stav, kdy se dva datové objekty odkazují navzájem na sebe, ale na ně jako skupinu se již nic neodkazuje. Automatické odstraňování datových objektů z paměti má na starost garbage collector.
Ruční odstranění datového objektu z paměti (na příkaz programátora) není možné. Programátor může pouze ovlivňovat chování garbage collectoru. To jest práce s pamětí počítače je plně v kompetenci Pythonu. Paměť počítače tak programátor v Pythonu nemá plně pod kontrolou, ale na druhou stranu ani nemůže udělat řadu nepříjemných chyb vedoucí k nečekaným pádům programů nebo bezpečnostním problémům typu buffer overflow, které se stávají programátorům v jazycích s přímou správou paměti. Garbage collector mají například i jazyky Java nebo C#, přímou správu paměti například jazyky C nebo C++.