Spațiul de nume Python și domeniul de aplicare al unei variabile

În acest tutorial, veți afla despre spațiul de nume, maparea de la nume la obiecte și sfera unei variabile.

Ce este numele în Python?

Dacă ați citit vreodată „Zenul lui Python” (introduceți import thisîn interpretul Python), ultima linie afirmă, Spațiile de nume sunt o idee grozavă - să facem mai multe dintre acestea! Deci, care sunt aceste spații de nume misterioase? Să ne uităm mai întâi la ce nume este.

Nume (numit și identificator) este pur și simplu un nume dat obiectelor. Totul din Python este un obiect. Numele este o modalitate de a accesa obiectul subiacent.

De exemplu, atunci când facem misiunea a = 2, 2este un obiect stocat în memorie și a este numele cu care îl asociem. Putem obține adresa (în RAM) a unui obiect prin funcția încorporată id(). Să ne uităm la modul de utilizare.

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

Ieșire

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

Aici, ambele se referă la același obiect 2, deci au același obiect id(). Să facem lucrurile puțin mai interesante.

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

Ieșire

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

Ce se întâmplă în secvența de pași de mai sus? Să folosim o diagramă pentru a explica acest lucru:

Diagrama de memorie a variabilelor din Python

Inițial, un obiect 2este creat și numele a este asociat cu acesta, atunci când o facem a = a+1, 3se creează un obiect nou și acum a este asociat cu acest obiect.

Rețineți că id(a)și id(3)au aceleași valori.

Mai mult, când b = 2este executat, noul nume b se asociază cu obiectul anterior 2.

Acest lucru este eficient, deoarece Python nu trebuie să creeze un nou obiect duplicat. Această natură dinamică a legării de nume face Python puternic; un nume se poate referi la orice tip de obiect.

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

Toate acestea sunt valabile și a se va referi la trei tipuri diferite de obiecte în instanțe diferite. Funcțiile sunt și ele obiecte, astfel încât un nume poate face referire și la ele.

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

Ieșire

 Buna ziua

Același nume a se poate referi la o funcție și putem apela funcția folosind acest nume.

Ce este un spațiu de nume în Python?

Acum, că înțelegem ce sunt numele, putem trece la conceptul de spații de nume.

Pentru a pune pur și simplu, un spațiu de nume este o colecție de nume.

În Python, vă puteți imagina un spațiu de nume ca o mapare a fiecărui nume pe care l-ați definit la obiectele corespunzătoare.

Diferite spații de nume pot coexista la un moment dat, dar sunt complet izolate.

Un spațiu de nume care conține toate numele încorporate este creat atunci când pornim interpretul Python și există atâta timp cât interpretorul rulează.

Acesta este motivul pentru care a construit în funcții , cum ar fi id(), print()etc sunt întotdeauna disponibile pentru noi din orice parte a programului. Fiecare modul își creează propriul spațiu de nume global.

Aceste spații de nume diferite sunt izolate. Prin urmare, același nume care poate exista în diferite module nu se ciocnește.

Modulele pot avea diverse funcții și clase. Un spațiu de nume local este creat atunci când este apelată o funcție, care are toate numele definite în ea. Similar, este cazul clasei. Diagrama următoare poate ajuta la clarificarea acestui concept.

O diagramă a diferitelor spații de nume din Python

Scop variabil Python

Deși există diferite spații de nume definite, este posibil să nu le putem accesa pe toate din fiecare parte a programului. Conceptul de domeniu intră în joc.

Un scop este porțiunea unui program de unde un spațiu de nume poate fi accesat direct fără nici un prefix.

În orice moment, există cel puțin trei domenii imbricate.

  1. Domeniul de aplicare al funcției curente care are nume locale
  2. Domeniul de aplicare al modulului care are nume globale
  3. Scopul cel mai exterior care are nume încorporate

Când se face o referință în interiorul unei funcții, numele este căutat în spațiul de nume local, apoi în spațiul de nume global și, în cele din urmă, în spațiul de nume încorporat.

Dacă există o funcție în interiorul altei funcții, un nou domeniu este imbricat în interiorul domeniului local.

Exemplu de domeniu și spațiu de nume în Python

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

Aici, variabila a se află în spațiul de nume global. Variabila b se află în spațiul de nume local al outer_function()și c se află în spațiul de nume local imbricat al inner_function().

Când ne aflăm inner_function(), c este local pentru noi, b este nelocal și a este global. Putem citi și atribui noi valori lui c, dar putem citi numai b și a din inner_function().

Dacă încercăm să atribuim ca valoare lui b, se creează o nouă variabilă b în spațiul de nume local, care este diferit de b nonlocal. Același lucru se întâmplă atunci când atribuim o valoare unui.

Cu toate acestea, dacă declarăm a ca global, toate referințele și atribuțiile merg la global. În mod similar, dacă dorim să reconectăm variabila b, aceasta trebuie declarată ca fiind nelocală. Următorul exemplu va clarifica în continuare acest lucru.

 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)

După cum puteți vedea, rezultatul acestui program este

 a = 30 a = 20 a = 10

În acest program, trei variabile diferite a sunt definite în spații de nume separate și accesate corespunzător. În timp ce vă aflați în următorul program,

 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)

Ieșirea programului este.

 a = 30 a = 30 a = 30 

Aici, toate referințele și atribuțiile sunt la nivel global datorită utilizării cuvântului cheie global.

Articole interesante...