Prostor imena Python i opseg varijable

U ovom vodiču naučit ćete o imenskom prostoru, mapiranju imena iz objekata i opsegu varijable.

Što je Ime u Pythonu?

Ako ste ikada pročitali 'Zen of Python' (upišite import thisu tumač Python), u zadnjem retku stoji, Prostori imena jedna su sjajna ideja - učinimo još toga! Pa koji su to tajanstveni prostori imena? Pogledajmo prvo kako se zove.

Ime (koje se također naziva identifikator) jednostavno je ime dato objektima. Sve u Pythonu je objekt. Ime je način pristupa osnovnom objektu.

Na primjer, kada radimo zadatak a = 2, 2je li objekt pohranjen u memoriju, a a je ime s kojim ga povezujemo. Adresu (u RAM-u) nekog objekta možemo dobiti putem ugrađene funkcije id(). Pogledajmo kako ga koristiti.

 # Note: You may get different values for the id a = 2 print('id(2) =', id(2)) print('id(a) =', id(a))

Izlaz

 id (2) = 9302208 id (a) = 9302208

Ovdje se oba odnose na isti objekt 2, pa imaju isti id(). Učinimo stvari malo zanimljivijima.

 # 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))

Izlaz

 id (a) = 9302208 id (a) = 9302240 id (3) = 9302240 id (b) = 9302208 id (2) = 9302208

Što se događa u gore navedenom slijedu koraka? Upotrijebimo dijagram da to objasnimo:

Dijagram memorije varijabli u Pythonu

U početku se stvara objekt 2i s njim se povezuje ime a, kada to napravimo a = a+1, stvara se novi objekt 3, a sada je a pridruženo ovom objektu.

Imajte na umu da id(a)i id(3)imaju iste vrijednosti.

Nadalje, kada b = 2se izvrši, novo ime b povezuje se s prethodnim objektom 2.

To je učinkovito jer Python ne mora stvoriti novi duplicirani objekt. Ova dinamična priroda vezivanja imena čini Python moćnim; ime bi se moglo odnositi na bilo koju vrstu objekta.

 >>> a = 5 >>> a = 'Hello World!' >>> a = (1,2,3)

Sve su to valjane i a odnosi se na tri različite vrste objekata u različitim instancama. Funkcije su također objekti, tako da se naziv može odnositi i na njih.

 def printHello(): print("Hello") a = printHello a()

Izlaz

 zdravo

Isti naziv a može se odnositi na funkciju, a funkciju možemo nazvati pomoću tog imena.

Što je prostor imena u Pythonu?

Sad kad smo razumjeli što su imena, možemo prijeći na koncept prostora imena.

Jednostavno rečeno, prostor imena je zbirka imena.

U Pythonu možete zamisliti prostor imena kao mapiranje svakog imena koje ste definirali u odgovarajuće objekte.

Različiti imenski prostori mogu istovremeno postojati, ali su potpuno izolirani.

Prostor imena koji sadrži sva ugrađena imena stvara se kada pokrenemo Python interpreter i postoji sve dok interpretator radi.

To je razlog da je izgrađen-in funkcije kao što su id(), print()itd su uvijek na raspolaganju su nam iz bilo kojeg dijela programa. Svaki modul kreira svoj vlastiti globalni prostor imena.

Ti su različiti imenski prostori izolirani. Stoga se isti naziv koji može postojati u različitim modulima ne sudara.

Moduli mogu imati razne funkcije i klase. Lokalni prostor imena stvara se kada se pozove funkcija koja u sebi ima sva definirana imena. Sličan je slučaj i s klasom. Sljedeći dijagram može vam pomoći pojasniti ovaj koncept.

Dijagram različitih prostora imena u Pythonu

Python promjenjivi opseg

Iako su definirani različiti jedinstveni prostori imena, možda im nećemo moći pristupiti iz svih dijelova programa. U obzir dolazi koncept opsega.

Opseg je dio programa odakle se imenskom prostoru može pristupiti izravno bez ikakvog prefiksa.

U bilo kojem trenutku postoje najmanje tri ugniježđena područja.

  1. Opseg trenutne funkcije koja ima lokalna imena
  2. Opseg modula koji ima globalna imena
  3. Krajnji opseg koji ima ugrađena imena

Kada se referenca uputi unutar funkcije, ime se traži u lokalnom imenskom prostoru, zatim u globalnom imenskom prostoru i na kraju u ugrađenom imenskom prostoru.

Ako unutar druge funkcije postoji funkcija, novi opseg je ugniježđen unutar lokalnog opsega.

Primjer opsega i prostora imena u Pythonu

 def outer_function(): b = 20 def inner_func(): c = 30 a = 10

Here, the variable a is in the global namespace. Variable b is in the local namespace of outer_function() and c is in the nested local namespace of inner_function().

When we are in inner_function(), c is local to us, b is nonlocal and a is global. We can read as well as assign new values to c but can only read b and a from inner_function().

If we try to assign as a value to b, a new variable b is created in the local namespace which is different than the nonlocal b. The same thing happens when we assign a value to a.

However, if we declare a as global, all the reference and assignment go to the global a. Similarly, if we want to rebind the variable b, it must be declared as nonlocal. The following example will further clarify this.

 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)

As you can see, the output of this program is

 a = 30 a = 20 a = 10

U ovom su programu tri različite varijable a definirane u zasebnim imenskim prostorima i njima se pristupa u skladu s tim. Dok ste u sljedećem programu,

 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)

Rezultat programa je.

 a = 30 a = 30 a = 30 

Ovdje se sve reference i zadaci odnose na globalni a zbog upotrebe ključne riječi global.

Zanimljivi članci...