Anatomie proměnné
V dřívějších článcích jsme si řekli, že proměnná je něco jako krabička nebo kontejner, do kterého můžeme ukládat data – čísla, texty nebo jiná data. Tato „krabička“ má svou adresu v paměti počítače, kde jsou uloženy konkrétní hodnoty.
Přesněji řečeno, proměnná je pojmenované místo v paměti. Toto místo má:
- Název - to je to, jak proměnnou vidíme a používáme v kódu.
- Hodnotu - data, která jsou v proměnné uložena.
- Datový typ - který určuje jakým způsobem je hodnota zakódována v paměti a jak se s ní může zacházet, tj. jaké operátory můžeme aplikovat.
Zobrazení hodnoty a typu proměnné
Podívejme se na jednoduchý příklad, jak zjistit hodnotu a typ proměnné v Pythonu:
promenna = 5 # proměnná s názvem 'promenna' obsahuje hodnotu 5
print(promenna) # vypíše 5
# Získání typu proměnné
typ_promenne = type(promenna)
print(typ_promenne) # vypíše <class 'int'>
Paměťová adresa proměnné
Každá proměnná je v Pythonu uložena na určitém místě v paměti, a každé z těchto míst má svou jedinečnou adresu. K této adrese se můžeme dostat pomocí funkce id()
, která nám vrátí paměťovou adresu proměnné.
adresa_promenne = id(promenna)
print(adresa_promenne) # např. 140719805392944
Paměťová adresa je unikátní pro každý objekt v Pythonu a hraje důležitou roli při pochopení identity objektů. To znamená, že dvě proměnné mohou ukazovat na stejnou hodnotu v paměti, pokud mají stejnou adresu.
Ukazatele a změna hodnoty
Podívejme se blíže na chování proměnných přiřazením stejné hodnoty.
a = 5
b = a
print(a) # 5
print(b) # 5
print(id(a)) # např. 140719805392944
print(id(b)) # např. 140719805392944
V tomto případě ukazují obě proměnné a
a b
na stejnou paměťovou adresu, což znamená, že ukazují na stejný objekt v paměti.
Když však změníme hodnotu proměnné b
, Python vytvoří novou paměťovou adresu pro b
, zatímco a
zůstane na původní adrese.
a = 5
b = a
print(a) # 5
print(b) # 5
print(id(a)) # např. 140719805392944
print(id(b)) # např. 140719805392944
b = 6
print(a) # vypíše 5
print(b) # vypíše 6
print(id(a)) # např. 140719805392944 (nezměněno)
print(id(b)) # např. 140719805392976 (nová adresa)
b = 7
print(id(b)) # např. 140719805393008
b = 5
print(id(b)) # např. 140719805392944
b = 6
print(id(b)) # např. 140719805392976
Při změnně hodnoty proměnné došlo ke změnně adresy. To k čemu ve skutečnosti došlo bylo, že python si zabral novou paměťovou pozici v počítačí, uložil do ní hodnotu 6
a proměnné b
přiřadil novou adresu na kterou ukazuje. Pokud by to fungovalo tak, že by se změnila hodnota na původní adrese, tak by se změnila také hodnota proměnné a
. Ke změně adresy dojde také při další změnně hodnoty proměnné b
. Co se stane s paměťovou pozicí s hodnotou 6
? Bude uvolněna pro další účely. Když nastavíme hodnotu opět na 5
, tak se použije již existující paměťová pozice s touto hodnotou 😱
Jak Python spravuje paměť?
Když se proměnné mění a jejich hodnoty se přesouvají na nová místa v paměti, stará paměťová místa jsou uvolněna a připravena k opětovnému použití. Python má zabudovaný systém zvaný garbage collector, který se stará o správu a uvolňování paměti za nás.
Pokud znovu přiřadíme proměnné hodnotu, která už byla někde v paměti, Python často využije již existující paměťovou pozici, jak se stalo v předchozím příkladu.
To vše se děje na pozadí a programátor se o tyto detaily starat nemusí. To je výhoda Pythonu oproti jiným tzv. nízkoúrovňovým programovacím jazykům, kde máme větší kontrolu nad pamětí, což má zase výhodu v tom, že dokážeme lépe optimalizovat.
Závěr: Co je proměnná v Pythonu?
Když mluvíme o proměnné, mluvíme ve skutečnosti o třech věcech:
- Typ - datový typ určuje, jaké operace lze na hodnotu aplikovat a jak je uložena v paměti.
- Hodnota - data uložená v proměnné.
- Adresa - paměťové místo, kde je hodnota proměnné uložena.
Tyto koncepty jsou základem pro práci s proměnnými v Pythonu a pochopení, jak fungují, vám pomůže při práci se složitějšími datovými strukturami, jako jsou pole a objekty.