MySQL Java JavaScript PHP Python HTML-CSS C-sharp

Domeniul de vizibilitate al variabilelor

Domeniul de vizibilitate sau scope-ul determină contextul unei variabile, în cadrul căruia aceasta poate fi utilizată. În Python există două tipuri de context: global și local.

Contextul global

Contextul global implică faptul că o variabilă este globală, adică este definită în afara oricărei funcții și este accesibilă oricărei funcții din program. De exemplu:

name = "Tom"
def say_hi():
   print("Hello", name)
def say_bye():
   print("Good bye", name)
say_hi()
say_bye()

Aici, variabila name este globală și are un domeniu de vizibilitate global. Ambele funcții definite aici o pot utiliza liber.

Contextul local

Spre deosebire de variabilele globale, o variabilă locală este definită în interiorul unei funcții și este accesibilă doar din acea funcție, adică are un domeniu de vizibilitate local:

def say_hi():
   name = "Sam"
   surname = "Johnson"
   print("Hello", name, surname)

def say_bye():
   name = "Tom"
   print("Good bye", name)

say_hi()
say_bye()

În acest caz, în fiecare dintre cele două funcții este definită o variabilă locală name. Deși aceste variabile au aceleași nume, ele sunt două variabile diferite, fiecare fiind accesibilă doar în cadrul funcției sale. De asemenea, în funcția say_hi() este definită variabila surname, care este de asemenea locală, așa că nu putem să o folosim în funcția say_bye().

Ascunderea variabilelor

Există și o altă situație în care o variabilă locală ascunde o variabilă globală cu același nume:

name = "Tom"
def say_hi():
   name = "Bob"  # ascunde valoarea variabilei globale
   print("Hello", name)
def say_bye():
   print("Good bye", name)
say_hi()    # Hello Bob
say_bye()   # Good bye Tom

Aici, este definită o variabilă globală name. Totuși, în funcția say_hi este definită o variabilă locală cu același nume name. Și dacă funcția say_bye folosește variabila globală, funcția say_hi folosește variabila locală, care ascunde variabila globală.

Dacă dorim să modificăm variabila globală într-o funcție locală, și nu să definim una locală, trebuie să folosim cuvântul cheie global:

name = "Tom"
def say_hi():
   global name
   name = "Bob"  # modifică valoarea variabilei globale
   print("Hello", name)
def say_bye():
   print("Good bye", name)
say_hi()    # Hello Bob
say_bye()   # Good bye Bob

nonlocal

Expresia nonlocal atașează un identificator la o variabilă din cel mai apropiat context înconjurător (cu excepția contextului global). De obicei, nonlocal se folosește în funcțiile imbricate, când trebuie să atașăm un identificator la o variabilă sau parametru al funcției exterioare înconjurătoare. Să analizăm o situație în care această expresie poate fi utilă:

def outer():  # funcție exterioară
   n = 5
   def inner():  # funcție imbricată
       print(n)
   inner()  # 5
   print(n)
outer()  # 5

Aici, funcția locală imbricată inner() afișează pe consolă valoarea variabilei n, care este definită în funcția exterioară outer(). Apoi, în funcția outer(), se apelează funcția internă inner().

La apelul funcției outer(), vom vedea așteptat pe consolă de două ori numărul 5. Totuși, în acest caz, funcția imbricată inner() doar accesează valoarea. Acum să luăm o altă situație în care funcția imbricată atribuie o valoare variabilei:

def outer():  # funcție exterioară
   n = 5
   def inner():  # funcție imbricată
       n = 25
       print(n)
   inner()  # 25
   print(n)
outer()  # 5
# 25    - inner
# 5     - outer

La atribuirea valorii în funcția imbricată: n = 25 va fi creată o nouă variabilă n, care va ascunde variabila n din funcția exterioară outer. În final, vom obține la afișare două numere diferite. Pentru a specifica în funcția imbricată că identificatorul din funcția imbricată va reprezenta variabila din funcția înconjurătoare, se folosește expresia nonlocal:

def outer():  # funcție exterioară
   n = 5
   def inner():  # funcție imbricată
       nonlocal n  # indicăm că n este o variabilă din funcția înconjurătoare
       n = 25
       print(n)
   inner()  # 25
   print(n)
outer()  # 25
← Lecția anterioară Lecția următoare →