Menný priestor Python a rozsah premennej

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

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

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.

  1. Rozsah aktuálnej funkcie, ktorá má miestne názvy
  2. Rozsah modulu, ktorý má globálne názvy
  3. 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.

Zaujímavé články...