Keď začneš písať väčšie programy s funkciami, narazíš na otázku: kde všade je moja premenná dostupná? Odpoveď závisí od platnosti premennej — anglicky scope.
Čo je platnosť premennej?
Platnosť určuje, v ktorej časti programu môžeš premennú používať. Mimo jej platnosti premenná jednoducho neexistuje — program ju nevidí.
Existujú dve základné úrovne platnosti:
- Lokálna — premenná existuje len vo vnútri funkcie, kde bola vytvorená.
- Globálna — premenná je vytvorená mimo funkcií a je dostupná v celom programe.
Lokálna platnosť
Keď vytvoríš premennú vo vnútri funkcie, táto premenná je lokálna — existuje len počas behu tej funkcie a po jej skončení zanikne.
def pozdrav():
sprava = "Ahoj!" # lokálna premenná
print(sprava)
pozdrav()
# print(sprava) # CHYBA — sprava tu neexistuje
Keby si sa pokúsil použiť sprava mimo funkcie pozdrav, Python by vypísal chybu NameError, pretože v tomto kontexte premenná neexistuje.
Lokálne premenné sú výhodné: rôzne funkcie môžu mať premenné s rovnakým názvom bez toho, aby si navzájom prekážali. Je to ako keby každá funkcia mala vlastný pracovný priestor.
Globálna platnosť
Premenná vytvorená na vrchnej úrovni programu (mimo akejkoľvek funkcie) je globálna — funkcie ju môžu čítať.
meno = "Tomáš" # globálna premenná
def pozdrav():
print(f"Ahoj, {meno}!") # čítame globálnu premennú
pozdrav() # vypíše: Ahoj, Tomáš!
Zmena globálnej premennej z funkcie
Ak chceš globálnu premennú nielen čítať, ale aj meniť jej hodnotu zvnútra funkcie, musíš použiť kľúčové slovo global:
skore = 0 # globálna premenná
def pridaj_bod():
global skore # hovoríme Pythonu, že meníme globálnu premennú
skore = skore + 1
pridaj_bod()
pridaj_bod()
print(skore) # vypíše: 2
Príliš časté používanie global je považované za zlú prax. Robí kód ťažko čitateľným a laditeľným. Radšej hodnoty odovzdávaj cez parametre a vracaj cez return.
Čo sa stane pri konflikte názvov?
Ak existuje lokálna premenná s rovnakým názvom ako globálna, Python vždy uprednostní lokálnu:
farba = "modrá" # globálna
def vypis_farbu():
farba = "červená" # lokálna — zakrýva globálnu
print(farba)
vypis_farbu() # vypíše: červená
print(farba) # vypíše: modrá — globálna sa nezmenila
Prehľad pravidiel platnosti
| Typ | Kde je definovaná | Kde je dostupná |
|---|---|---|
| Globálna | Mimo funkcií | Všade v programe |
| Lokálna | Vo vnútri funkcie | Len v tej funkcii |
Dobrým zvykom je minimalizovať globálne premenné. Program, ktorý pracuje hlavne s lokálnymi premennými a funkciami, je prehľadnejší a ľahšie sa v ňom hľadajú chyby.
Cvičné príklady
Čo vypíše nasledujúci kód? x = 10 \n def test(): \n x = 20 \n print(x) \n test() \n print(x)
Zobraziť odpoveď
Prečo je nadmerné používanie globálnych premenných a kľúčového slova global problémom?