sammanfattning: för att lösa en UnboundLocalError när den lokala variabeln omfördelas efter första användningen kan du antingen använda global nyckelordet eller nonlocal nyckelordet. Med global – sökordet kan du ändra värdena för en global variabel från en funktions lokala räckvidd medan nonlocal – sökordet ger liknande funktioner vid kapslade funktioner.

Problem: givet en lokal variabel. Hur löser man en UnboundLocalError när den lokala variabeln omfördelas efter första användningen?

exempel:

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

utgång:

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

innan vi hanterar lösningarna på vårt problem måste vi förstå grundorsaken bakom UnboundLocalError.

grundorsaken till UnboundLocalErrors:

när en variabel tilldelas inom en funktion behandlas den som en lokal variabel som standard i Python. Om en lokal variabel refereras innan ett värde har tilldelats / bundits till det, höjs en UnboundLocalError . I ovanstående exempel när variabeln 'val' läses av Python-tolken inuti funktionen func() antar den att 'val' är en lokal variabel. Det inser dock snart att den lokala variabeln har refererats innan något värde har tilldelats den inom funktionen. Således kastar den en UnboundLocalError.

med andra ord kan vi bara komma åt en global variabel i en funktion men kan inte ändra den från funktionen (om du inte tvingar en global eller icke-lokal tilldelning med hjälp av nyckelorden global eller nonlocal).

Obs: den överordnade klassen för alla Python-undantag är BaseException. Följande diagram representerar undantagshierarkin för UnboundLocalError.

 Unboundlocalerror Exception Hierarchy

nu när vi vet varför och när en UnboundLocalError höjs, låt oss ta en titt på de troliga lösningarna för att övervinna detta fel.

Innehållsförteckning

Metod 1: med hjälp av det globala nyckelordet

kan vi använda nyckelordet global för att komma åt och ändra en global variabel från den lokala omfattningen av en funktion. Varje variabel som skapas utanför en funktion är global som standard medan varje variabel som skapas inom funktionen är lokal som standard. För att ändra en global variabel inifrån funktionen och undvika en UnboundLocalError kan vi använda nyckelordet global.

Låt oss ta en titt på följande kod som förenklar ovanstående koncept:

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

utgång:

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

Metod 2: Använda icke-lokalt nyckelord

nyckelordet nonlocal används när vi har en kapslad funktion. I en sådan situation kan lokal räckvidd för en variabel inte definieras, det vill säga omfattningen av en variabel är varken lokal eller global.

Låt oss ta en titt på följande exempel för att förstå användningen av nyckelordet nonlocal för att hantera vårt problem.

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

Output

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

i ovanstående program används nonlocal nyckelordet med variabeln val inuti den kapslade funktionen foo() för att skapa en icke-lokal variabel. Om värdet på variabeln nonlocal ändras återspeglas ändringarna också i den lokala variabeln.

ansvarsfriskrivning: nyckelordet nonlocal fungerar bara i Python 3 och senare.

Metod 3: Använda ett muterbart objekt

eftersom nonlocal inte fungerar i versioner av Python före Python 3 kan du använda ett muterbart objekt som en python-ordbok för att lagra värdena om du inte vill skapa en global variabel.

Låt oss ta en titt på följande program för att förstå användningen av ett muterbart objekt för att övervinna 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

Metod 4: passerar parametrar till funktionen

Detta är det traditionella sättet att lösa vårt problem. Istället för att använda en global variabel kan vi skicka parametrar till den definierade funktionen för att undvika en UnboundLocalError. Låt oss ta en titt på följande kod för att se hur detta kan göras:

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

utgång:

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

Global Keyword vs Nonlocal Keyword

innan vi avslutar den här artikeln, låt oss ta en titt på de viktigaste skillnaderna mellan en global och nonlocal variabel/nyckelord.

  1. till skillnad från global nyckelordet, nonlocal nyckelordet fungerar bara i Python 3 och ovan.
  2. global nyckelordet kan användas med befintliga globala variabler eller nya variabler medan nonlocal nyckelordet måste definieras med en befintlig variabel.

slutsats

från ovanstående diskussion lärde vi oss att för att hantera UnboundLocalError i vår kod kan vi använda en av följande metoder:

  1. använd nyckelordet global .
  2. använd nyckelordet nonlocal vid kapslade funktioner.
  3. Använd ett muterbart objekt.
  4. skicka parametrar till en funktion.

jag hoppas att du hittade den här artikeln till hjälp och efter att ha läst den kan du hantera UnboundLocalError med lätthet. Vänligen håll ögonen öppna för mer intressanta artiklar.

vart ska man gå härifrån?

nog teori, låt oss få lite övning!

för att bli framgångsrik i kodning måste du komma ut och lösa verkliga problem för riktiga människor. Så kan du enkelt bli en sexsiffrig Tjänsteman. Och så polerar du de färdigheter du verkligen behöver i praktiken. När allt kommer omkring, vad är användningen av inlärningsteori som ingen någonsin behöver?

Practice projects är hur du skärper din såg i kodning!

vill du bli en kodmästare genom att fokusera på praktiska kodprojekt som faktiskt tjänar pengar och löser problem för människor?

bli sedan en Python frilansutvecklare! Det är det bästa sättet att närma sig uppgiften att förbättra dina Python-färdigheter-även om du är en komplett nybörjare.

gå med i mitt gratis webinar” How to Build Your High-Income Skill Python ” och se hur jag växte min kodningsverksamhet online och hur du också kan—från ditt eget hem.

gå med i gratis webinar nu!