V tomto tutoriále sa dozviete o mennom priestore, mapovaní od mien k objektom a rozsahu premennej.
Čo je meno v Pythone?
Ak ste niekedy čítali text „The Zen of Python“ (zadajte import thistlmočníka Pythonu), v poslednom riadku sa uvádza, že namespace sú vynikajúci nápad - urobme ich viac! Takže aké sú tieto záhadné menné priestory? Najprv sa pozrime, aké je meno.
Názov (tiež nazývaný identifikátor) je jednoducho názov daný objektom. Všetko v Pythone je objekt. Názov je spôsob prístupu k základnému objektu.
Napríklad, keď robíme zadanie a = 2, 2je objekt uložený v pamäti a a je názov, s ktorým ho spojíme. Cez vstavanú funkciu môžeme získať adresu (v RAM) nejakého objektu id(). Pozrime sa, ako to využiť.
 # Note: You may get different values for the id a = 2 print('id(2) =', id(2)) print('id(a) =', id(a))
Výkon
id (2) = 9302208 id (a) = 9302208
Tu obidva odkazujú na rovnaký objekt 2, takže majú rovnaký id(). Poďme urobiť veci trochu zaujímavejšími.
 # Note: You may get different values for the id a = 2 print('id(a) =', id(a)) a = a+1 print('id(a) =', id(a)) print('id(3) =', id(3)) b = 2 print('id(b) =', id(b)) print('id(2) =', id(2))
Výkon
id (a) = 9302208 id (a) = 9302240 id (3) = 9302240 id (b) = 9302208 id (2) = 9302208
Čo sa deje vo vyššie uvedenom poradí krokov? Na vysvetlenie použijeme diagram:
 Pamäťový diagram premenných v Pythone
 Pamäťový diagram premenných v Pythone
Spočiatku 2je vytvorený objekt a je s ním spojené meno a, keď to urobíme a = a+1, vytvorí sa nový objekt 3a teraz je k tomuto objektu priradené a.
Všimnite si, že id(a)aj id(3)majú rovnaké hodnoty.
Ďalej, keď b = 2sa vykoná, nový názov b sa spojí s predchádzajúcim objektom 2.
Je to efektívne, pretože Python nemusí vytvárať nový duplicitný objekt. Táto dynamická povaha viazania mien robí Python silným; názov by sa mohol vzťahovať na akýkoľvek typ objektu.
 >>> a = 5 >>> a = 'Hello World!' >>> a = (1,2,3)
Všetky tieto sú platné a a bude odkazovať na tri rôzne typy objektov v rôznych prípadoch. Funkcie sú tiež objektmi, takže sa na ne môže vzťahovať aj názov.
 def printHello(): print("Hello") a = printHello a()
Výkon
Ahoj
Rovnaký názov a môže odkazovať na funkciu a pomocou tohto názvu ju môžeme nazvať.
Čo je to menný priestor v Pythone?
Teraz, keď chápeme, čo sú to mená, môžeme prejsť na koncept menných priestorov.
Zjednodušene povedané, menný priestor je zbierka mien.
V Pythone si môžete predstaviť menný priestor ako mapovanie každého definovaného mena k zodpovedajúcim objektom.
V danom čase môžu existovať rôzne menné priestory, ale sú úplne izolované.
Obor názvov obsahujúci všetky zabudované názvy sa vytvorí, keď spustíme tlmočník Python, a existuje, pokiaľ tlmočník beží.
To je dôvod, že vstavané funkcie, ako je id(), print()atď. Sú vždy máme k dispozícii z ktorejkoľvek časti programu. Každý modul vytvára svoj vlastný globálny priestor názvov.
Tieto rôzne menné priestory sú izolované. Rovnaký názov, ktorý môže existovať v rôznych moduloch, sa preto nezrazí.
Moduly môžu mať rôzne funkcie a triedy. Lokálny priestor mien sa vytvorí, keď sa volá funkcia, ktorá má v sebe definované všetky názvy. Podobné je to v prípade triedy. Nasledujúci diagram môže pomôcť objasniť tento koncept.
 Schéma rôznych menných priestorov v Pythone
 Schéma rôznych menných priestorov v Pythone 
Variabilný rozsah Pythonu
Aj keď sú definované rôzne jedinečné menné priestory, nemusíme mať prístup ku všetkým z každej časti programu. Do hry vstupuje koncept rozsahu.
Rozsah je časť programu, z ktorej je možné pristupovať k mennému priestoru priamo bez akejkoľvek predvoľby.
V danom okamihu existujú najmenej tri vnorené obory.
- Rozsah aktuálnej funkcie, ktorá má miestne názvy
- Rozsah modulu, ktorý má globálne názvy
- Najvzdialenejší rozsah, ktorý má zabudované názvy
Keď sa vo funkcii urobí odkaz, názov sa hľadá v lokálnom mennom priestore, potom v globálnom mennom priestore a nakoniec vo vstavanom mennom priestore.
Ak je funkcia v inej funkcii, nový rozsah je vnorený do lokálneho rozsahu.
Príklad rozsahu a menného priestoru v Pythone
 def outer_function(): b = 20 def inner_func(): c = 30 a = 10
Tu sa premenná a nachádza v globálnom mennom priestore. Premenná b je v lokálnom mennom priestore outer_function()ac je c vo vnorenom lokálnom mennom priestore inner_function().
Keď sme v inner_function(), c je pre nás lokálne, b je nelokálne a a je globálne. Môžeme čítať aj priraďovať nové hodnoty k c, ale môžeme čítať iba b a a z inner_function().
Ak sa pokúsime priradiť ako hodnotu b, v lokálnom mennom priestore sa vytvorí nová premenná b, ktorá je odlišná od nelokálneho b. To isté sa stane, keď priradíme hodnotu a.
Ak však vyhlásime a za globálne, všetky referencie a priradenia sa dostanú do globálneho a. Podobne, ak chceme premeniť väzbu b znova, musí byť deklarovaná ako nelokálna. Nasledujúci príklad to ešte objasní.
 def outer_function(): a = 20 def inner_function(): a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a)
Ako vidíte, výstupom tohto programu je
a = 30 a = 20 a = 10
V tomto programe sú definované tri rôzne premenné a v samostatných menných priestoroch a je k nim primerane pristupované. V nasledujúcom programe
 def outer_function(): global a a = 20 def inner_function(): global a a = 30 print('a =', a) inner_function() print('a =', a) a = 10 outer_function() print('a =', a)
Výstupom programu je.
a = 30 a = 30 a = 30
Tu sú všetky odkazy a priradenia globálne kvôli použitiu kľúčového slova global.








