V jazyku python pracujeme s premennými, funkciami, knižnicami a modulmi atď. Je možné, že názov premennej, ktorú sa chystáte použiť, už existuje ako názov inej premennej alebo ako názov inej funkcie či metódy. V takomto prípade sa musíme naučiť, ako všetky tieto názvy spravuje program v jazyku python. Ide o koncept menného priestoru.
Predstavte si menný priestor ako slovník, kde sú na jednej strane názvy premenných, funkcií,… a na druhej je samotná funkcia alebo premenná.
Nasledujú tri kategórie menných priestorov:
- Lokálny: Vznikajú počas behu funkcie.
- Globálny: Tento priestor uchováva všetky názvy funkcií a premenných, ktoré sú obsiahnuté v moduloch používaných v programe Python. Zahŕňa všetky názvy, ktoré sú súčasťou lokálneho priestoru názvov. Napríklad tkinter, canvas, randint
- Zabudovaný(štandartný, alebo builtins): Je to najvyššia úroveň priestoru názvov, ktorá je k dispozícii s predvolenými názvami dostupnými ako súčasť interpretu jazyka python, ktorý je načítaný ako programové prostredie. Zahŕňa globálny priestor názvov, ktorý zase zahŕňa lokálny priestor názvov.
Keď na nejakom mieste použijeme identifikátor, Python ho najprv hľadá (v tzv. menných priestoroch):
- v lokálnej tabuľke mien, ak tam tento identifikátor nenájde, hľadá ho
- v globálnej tabuľke mien, ak tam tento identifikátor nenájde, hľadá ho
- v štandardnej (builtin) tabuľke mien
Ak nenájde v žiadnej z týchto tabuliek, hlási chybu NameError: name 'identifikátor' is not defined
Najlepšie je si to vysvetliť na príklade, kde využijeme funkciu ktorá nám vypíše všetky názvy z daného priestoru kde ju zavoláme,…
premenna = 10
def funkcia_f():
premenna_in = 5
print(dir())
funkcia_f()
print(dir())
Výsledkom je:
['premenna_in']
['__annotations__', '__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'funkcia_f', 'premenna']
Je tu pekne vidno, ako sa zavolaním funkcie_f vytvorí vo vnútri lokálna premenná premenna_in, ale tento názov sa nenachádza v globálnych mennom priestore.
Ak by sa nám náhodou podarilo premenovať niektorú vstavanú funkciu ako napríklad print():
>>> def print():
pass
>>> print("hello")
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
print("hello")
TypeError: print() takes 0 positional arguments but 1 was given
>>>
Funkcia print už nebude fungovať. Python nám vráti chybu. V tomto prípade, že mu chýba parameter.
Keď si teraz vypíšeme názvy cez funkciu dir(), už sa v globálnej tabuľke nachádza aj názov print a keďže python najskôr hľadá v globálnom priestore, prekryje nami vytvorená funkcia print, integrovanú funkciu print. Vieme to vyriešiť funkciou del(), ktorá odstráni nami vytvorenú funkciu z globálneho menného priestoru.
>>> del(print)
>>> print("hello")
hello
>>>