Ce face global și nonlocal
O variabilă căreia îi dai o valoare într-o funcție este locală acelei funcții. Ca să modifici o variabilă de la nivelul fișierului, o declari întâi cu global nume. Citirea unei variabile globale nu are nevoie de global.
nonlocal se folosește în funcții definite în alte funcții (closure) și se referă la variabila din funcția exterioară. În cod obișnuit, evită variabilele globale: transmite valorile prin parametri și return.
Exemple
Exemplul 1: global
vizitatori = 0
def vizita():
global vizitatori
vizitatori += 1
vizita()
vizita()
print(vizitatori)
Rezultat
2
Exemplul 2: nonlocal într-un contor
def creeaza_contor():
numar = 0
def urmatorul():
nonlocal numar
numar += 1
return numar
return urmatorul
contor = creeaza_contor()
print(contor(), contor(), contor())
Rezultat
1 2 3
Exemplul 3: Fără global apare o eroare
total = 10
def adauga():
try:
total += 5
except UnboundLocalError as e:
print("Eroare:", e)
adauga()
Rezultat
Eroare: cannot access local variable 'total' where it is not associated with a value
Greșeli frecvente
- Modifici o variabilă globală fără
globalși primeștiUnboundLocalError. - Folosești
globalpeste tot pentru a „transmite” date între funcții. Codul devine greu de urmărit; folosește parametri și valori returnate.
Comenzi înrudite
def: Definește o funcție: un bloc de cod cu nume, pe care îl poți apela de oricâte ori.globals(), locals() și vars(): Returnează dicționarele cu variabilele globale, cele locale sau atributele unui obiect.lambda: Creează o funcție mică, fără nume, scrisă pe un singur rând.