Samenvatting: om een UnboundLocalError op te lossen wanneer de lokale variabele opnieuw wordt toegewezen na het eerste gebruik, kunt u het global sleutelwoord of het nonlocal sleutelwoord gebruiken. Met het global sleutelwoord kunt u de waarden van een globale variabele wijzigen vanuit het lokale bereik van een functie, terwijl het nonlocal sleutelwoord vergelijkbare functionaliteit biedt in het geval van geneste functies.

probleem: gegeven een lokale variabele. Hoe een UnboundLocalError oplossen wanneer de lokale variabele opnieuw wordt toegewezen na het eerste gebruik?

voorbeeld:

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

uitvoer:

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

voordat we ons bezighouden met de oplossingen voor ons probleem, moeten we de onderliggende oorzaak achter UnboundLocalErrorbegrijpen.

oorzaak van ongebonden lokale fouten:

wanneer een variabele binnen een functie is toegewezen, wordt deze standaard in Python als een lokale variabele behandeld. Als naar een lokale variabele wordt verwezen voordat er een waarde aan is toegewezen/gekoppeld, wordt een UnboundLocalError verhoogd. In het bovenstaande voorbeeld, wanneer de variabele 'val' wordt gelezen door de Python interpreter binnen de functie func(), wordt aangenomen dat 'val' een lokale variabele is. Echter, het realiseert zich al snel dat de lokale variabele is verwezen voordat enige waarde is toegewezen aan het binnen de functie. Dus het gooit een UnboundLocalError.

met andere woorden, we hebben alleen toegang tot een globale variabele binnen een functie, maar kunnen deze niet wijzigen vanuit de functie (tenzij u een globale of nietlokale toewijzing forceert met behulp van de sleutelwoorden global of nonlocal).

Opmerking: De ouderklasse van alle Python-uitzonderingen is BaseException. Het volgende diagram geeft de uitzonderingshiërarchie van de UnboundLocalErrorweer.

Unboundlocalerror Exception hiërarchie

nu we weten waarom en wanneer een UnboundLocalError wordt verhoogd, laten we eens kijken naar de mogelijke oplossingen om deze fout te overwinnen.

inhoudsopgave:

Methode 1: met behulp van het globale sleutelwoord

kunnen we het global sleutelwoord gebruiken om toegang te krijgen tot een globale variabele vanuit het lokale bereik van een functie en deze te wijzigen. Elke variabele die buiten een functie wordt gemaakt, is standaard globaal, terwijl elke variabele die binnen de functie wordt gemaakt, standaard lokaal is. Dus, om een globale variabele vanuit de functie te wijzigen en een UnboundLocalError te vermijden, kunnen we het global sleutelwoord gebruiken.

laten we eens kijken naar de volgende code die het bovenstaande concept vereenvoudigt:

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

uitvoer:

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

Methode 2: niet-lokaal trefwoord

het nonlocal trefwoord wordt gebruikt wanneer we een geneste functie hebben. In een dergelijke situatie kan de lokale reikwijdte van een variabele niet worden gedefinieerd, dat wil zeggen dat de reikwijdte van een variabele noch lokaal noch Globaal is.

laten we eens kijken naar het volgende voorbeeld om het gebruik van het nonlocal sleutelwoord te begrijpen om ons probleem aan te pakken.

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

in het bovenstaande programma wordt het sleutelwoord nonlocal gebruikt met de variabele val binnen de geneste functie foo() om een niet-lokale variabele te maken. Als de waarde van de variabele nonlocal verandert, worden de veranderingen ook weerspiegeld in de lokale variabele.

Disclaimer: het nonlocal sleutelwoord werkt alleen in Python 3 en hoger.

Methode 3: Het gebruik van een veranderlijk Object

aangezien nonlocal niet werkt in versies van Python voor Python 3, kunt u een veranderlijk object zoals een Python woordenboek gebruiken om de waarden op te slaan als u geen globale variabele wilt aanmaken.

laten we eens kijken naar het volgende programma om het gebruik van een veranderlijk object te begrijpen om de UnboundLocalErrorte overwinnen.

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

Methode 4: Parameters doorgeven aan de functie

dit is de traditionele manier om ons probleem op te lossen. In plaats van een globale variabele te gebruiken, kunnen we parameters doorgeven aan de gedefinieerde functie om een UnboundLocalErrorte vermijden. Laten we eens kijken naar de volgende code om te zien hoe dit kan worden gedaan:

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

uitvoer:

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

Global Keyword vs Nonlocal Keyword

voordat we dit artikel afsluiten, laten we eens kijken naar de belangrijkste verschillen tussen een global en nonlocal variabele/trefwoorden.

  1. in tegenstelling tot het global sleutelwoord, werkt het nonlocal alleen in Python 3 en hoger.
  2. het global trefwoord kan worden gebruikt met reeds bestaande globale variabelen of nieuwe variabelen, terwijl het nonlocal trefwoord moet worden gedefinieerd met een reeds bestaande variabele.

conclusie

uit bovenstaande discussie hebben we geleerd dat we een van de volgende methoden kunnen gebruiken om UnboundLocalError in onze code te behandelen:

  1. gebruik het global sleutelwoord.
  2. gebruik het nonlocal sleutelwoord in het geval van geneste functies.
  3. gebruik een veranderlijk object.
  4. geef parameters door aan een functie.

ik hoop dat u dit artikel nuttig vond en na het lezen kunt u gemakkelijk omgaan met UnboundLocalError. Blijf op de hoogte voor meer interessante artikelen.

waar moet ik nu naartoe?

genoeg theorie, laten we wat oefenen!

om succesvol te worden in het coderen, moet je naar buiten gaan en echte problemen voor echte mensen oplossen. Zo kun je makkelijk een zes-cijferige verdiener worden. En zo polijst je de vaardigheden die je echt nodig hebt in de praktijk. Immers, wat is het nut van leren theorie die niemand ooit nodig heeft?

Oefenprojecten is hoe je je zaag scherpt in het coderen!

wilt u een code-master worden door u te concentreren op praktische code-projecten die u geld opleveren en problemen voor mensen oplossen?

word dan een Python freelance ontwikkelaar! Het is de beste manier om de taak van het verbeteren van uw Python vaardigheden te benaderen—zelfs als je een complete beginner bent.

Word lid van mijn gratis webinar “How to Build Your High-Income Skill Python” en kijk hoe ik mijn coderingsbedrijf online heb laten groeien en hoe jij dat ook kunt—vanuit het comfort van je eigen huis.

Meld u nu aan voor het gratis webinar!