Martin Svoboda

Martin Svoboda - Blog

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á:

  1. Název - to je to, jak proměnnou vidíme a používáme v kódu.
  2. Hodnotu - data, která jsou v proměnné uložena.
  3. 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 😱

Diagram managementu paměti při změně hodnoty proměnné

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:

  1. Typ - datový typ určuje, jaké operace lze na hodnotu aplikovat a jak je uložena v paměti.
  2. Hodnota - data uložená v proměnné.
  3. 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.