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 this
tlmoč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
, 2
je 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:

Spočiatku 2
je vytvorený objekt a je s ním spojené meno a, keď to urobíme a = a+1
, vytvorí sa nový objekt 3
a teraz je k tomuto objektu priradené a.
Všimnite si, že id(a)
aj id(3)
majú rovnaké hodnoty.
Ďalej, keď b = 2
sa 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.

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
.