Rezumat: pentru a rezolva o UnboundLocalError când variabila locală este reatribuită după prima utilizare, puteți utiliza fie cuvântul cheie global, fie cuvântul cheie nonlocal. Cuvântul cheie global vă permite să modificați valorile unei variabile globale din cadrul domeniului local al unei funcții, în timp ce cuvântul cheie nonlocal oferă funcționalități similare în cazul funcțiilor imbricate.

problemă: având în vedere o variabilă locală. Cum se rezolvă o UnboundLocalError când variabila locală este realocată după prima utilizare?

exemplu:

val = 100def func(): val = val + 100 print(val)func()

ieșire:

Traceback (most recent call last): File "C:/Users/Shubham-PC/PycharmProjects/pythonProject1/main.py", line 9, in <module> func() File "C:/Users/Shubham-PC/PycharmProjects/pythonProject1/main.py", line 5, in func val = val + 100UnboundLocalError: local variable 'val' referenced before assignment

înainte de a ne ocupa de soluțiile problemei noastre, trebuie să înțelegem cauza principală din spatele UnboundLocalError.

cauza rădăcină a UnboundLocalErrors:

când o variabilă este atribuită într-o funcție, este tratată ca o variabilă locală în mod implicit în Python. Dacă se face referire la o variabilă locală înainte ca o valoare să fie atribuită/legată de aceasta, se ridică un UnboundLocalError . În exemplul de mai sus, când variabila 'val' este citită de interpretul Python în interiorul funcției func(), se presupune că 'val' este o variabilă locală. Cu toate acestea, în curând își dă seama că variabila locală a fost referită înainte ca orice valoare să-i fie atribuită în cadrul funcției. Astfel, aruncă un UnboundLocalError.

cu alte cuvinte, putem accesa doar o variabilă globală în interiorul unei funcții, dar nu o putem modifica din interiorul funcției (cu excepția cazului în care forțați o atribuire globală sau nelocală folosind cuvintele cheie global sau nonlocal).

notă: clasa părinte a tuturor excepțiilor Python este BaseException. Următoarea diagramă reprezintă ierarhia excepțiilor UnboundLocalError.

UnboundLocalError excepție ierarhie

acum, că știm de ce și când un UnboundLocalError este ridicat, să ne aruncăm o privire la soluțiile probabile pentru a depăși această eroare.

cuprins

Metoda 1: folosind cuvântul cheie global

putem folosi cuvântul cheie global pentru a accesa și modifica o variabilă globală din domeniul local al unei funcții. Orice variabilă creată în afara unei funcții este globală în mod implicit, în timp ce orice variabilă creată în cadrul funcției este locală în mod implicit. Astfel, pentru a modifica o variabilă globală din cadrul funcției și pentru a evita un UnboundLocalError putem folosi cuvântul cheie global.

să aruncăm o privire la următorul cod care simplifică conceptul de mai sus:

val = 100print("Value at First Usage: ", val)def func(): global val val = val + 100 print("Output after Modification within func(): ", val)func()

ieșire:

Value at First Usage: 100Output after Modification within func(): 200

Metoda 2: folosind cuvinte cheie nelocale

nonlocal cuvântul cheie este utilizat atunci când avem o funcție imbricată. Într-o astfel de situație, domeniul de aplicare local al unei variabile ar putea să nu fie definit, adică domeniul de aplicare al unei variabile nu este nici local, nici global.

să aruncăm o privire la următorul exemplu pentru a înțelege utilizarea cuvântului cheie nonlocal pentru a rezolva problema noastră.

def func(): val = 50 print("Output of func:", val) def foo(): nonlocal val val = val + 100 print("Output of foo:", val) foo() print("Output of func() after changes made to foo():", val)func()

ieșire

Output of func: 50Output of foo: 150Output of func() after changes made to foo(): 150

în programul de mai sus, cuvântul cheie nonlocal este utilizat cu variabila val în interiorul funcției imbricate foo() pentru a crea o variabilă nelocală. Dacă valoarea variabilei nonlocal se modifică, modificările se reflectă și în variabila locală.

Disclaimer: cuvântul cheie nonlocal funcționează numai în Python 3 și mai sus.

metoda 3: Utilizarea unui obiect mutabil

deoarece nonlocal nu funcționează în versiunile Python înainte de Python 3, puteți utiliza un obiect mutabil ca un dicționar python, pentru a stoca valorile dacă nu doriți să creați o variabilă globală.

să aruncăm o privire la următorul program pentru a înțelege utilizarea unui obiect mutabil pentru a depăși UnboundLocalError.

variables = { # creating a mutable object/dictionary 'val': 100}print('Output before Modification of val: ', variables)def func(): variables += 50 print('Output after Modification of val: ', variables)func()
Output before Modification of val: 100Output after Modification of val: 150

Metoda 4: trecerea parametrilor la funcția

acesta este modul tradițional de rezolvare a problemei noastre. În loc să folosim o variabilă globală, putem trece parametrii la funcția definită pentru a evita un UnboundLocalError. Să aruncăm o privire la următorul cod pentru a vedea cum se poate face acest lucru:

val = 100print("Value of val at first use: ", val)def func(v): v = v + 100 print("Output of val after modification:", v)func(val)

ieșire:

Value of val at first use: 100Output of val after modification: 200

Global Keyword vs nonlocal Keyword

înainte de a încheia acest articol, să aruncăm o privire la diferențele cheie dintre o global și nonlocal variabilă/cuvinte cheie.

  1. spre deosebire de cuvântul cheie global, cuvântul cheie nonlocal funcționează numai în Python 3 și versiuni ulterioare.
  2. cuvântul cheie global poate fi utilizat cu variabile globale preexistente sau variabile noi, în timp ce cuvântul cheie nonlocal trebuie definit cu o variabilă preexistentă.

concluzie

din discuția de mai sus am aflat că pentru a trata UnboundLocalError în codul nostru putem folosi una dintre următoarele metode:

  1. utilizați cuvântul cheie global .
  2. utilizați cuvântul cheie nonlocal în cazul funcțiilor imbricate.
  3. utilizați un obiect mutabil.
  4. trece parametrii la o funcție.

sper că ați găsit acest articol util și după ce ați citit-o puteți face cu UnboundLocalError cu ușurință. Vă rugăm să rămâneți la curent pentru articole mai interesante.

unde să mergem de aici?

ajunge cu teoria, hai să exersăm!

pentru a avea succes în codificare, trebuie să ieșiți acolo și să rezolvați probleme reale pentru oameni reali. Așa puteți deveni cu ușurință un câștigător de șase cifre. Și așa lustruiți abilitățile de care aveți cu adevărat nevoie în practică. La urma urmei, la ce folosește teoria învățării de care nimeni nu are nevoie?

practica proiecte este modul în care ascuți văzut în codificare!

vrei să devii un maestru de cod concentrându-te pe proiecte practice de cod care îți câștigă bani și rezolvă probleme pentru oameni?

apoi deveniți dezvoltator independent Python! Este cel mai bun mod de a aborda sarcina de a vă îmbunătăți abilitățile Python—chiar dacă sunteți un începător complet.

Alăturați-vă webinarului meu Gratuit „Cum să vă construiți abilitățile cu venituri mari Python” și urmăriți cum mi—am dezvoltat afacerea de codificare online și cum puteți, de asemenea-din confortul propriei case.

Alăturați-vă webinarului gratuit acum!