global și nonlocal în Python

Funcții Python 3.0+

Permit unei funcții să modifice o variabilă din afara ei: globală (global) sau din funcția care o conține (nonlocal).

Sintaxă
global nume
nonlocal nume

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ști UnboundLocalError.
  • Folosești global peste 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.