Yhteenveto: jos haluat selvittää UnboundLocalError , kun paikallinen muuttuja on sijoitettu uudelleen ensimmäisen käytön jälkeen, voit käyttää joko global avainsanaa tai nonlocal avainsanaa. global – hakusanalla voidaan muuttaa kokonaismuuttujan arvoja funktion paikallisen soveltamisalan puitteissa, kun taas nonlocal – hakusanalla saadaan vastaava toiminnallisuus sisäkkäisten funktioiden tapauksessa.

ongelma: annetaan paikallinen muuttuja. Miten UnboundLocalError ratkaistaan, kun paikallinen muuttuja siirretään ensimmäisen käytön jälkeen?

esimerkki:

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

tuloste:

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

ennen kuin käsittelemme ongelmamme ratkaisuja, meidän on ymmärrettävä juurisyy UnboundLocalErrortakana.

Sitoutumattomien Paikallisvirheiden perussyy:

kun muuttujalle on annettu funktio, sitä käsitellään Pythonissa oletuksena paikallisena muuttujana. Jos paikallismuuttujaan viitataan ennen kuin sille on annettu/sidottu arvo, nostetaan arvo UnboundLocalError . Kun Yllä olevassa esimerkissä muuttuja 'val' luetaan Python-tulkilla funktion func() sisällä, oletetaan, että 'val' on paikallinen muuttuja. Se kuitenkin huomaa pian, että paikallinen muuttuja on viitattu ennen kuin sille on annettu mitään arvoa funktion sisällä. Näin se heittää UnboundLocalError.

toisin sanoen, voimme käyttää globaalia muuttujaa vain funktion sisällä, mutta emme voi muuttaa sitä funktion sisältä (ellet pakota globaalia tai ei-paikallista määritystä käyttämällä global tai nonlocal avainsanoja).

Huom: kaikkien Python-poikkeusten kantaluokka on BaseException. Seuraavassa kaaviossa esitetään poikkeushierarkia UnboundLocalError.

UnboundLocalError Exception Hierarchy

nyt kun tiedämme miksi ja milloin UnboundLocalError nostetaan esiin, tarkastelkaamme todennäköisiä ratkaisuja tämän virheen poistamiseksi.

Sisällysluettelo

menetelmä 1: käyttämällä globaalia hakusanaa

voimme käyttää global hakusanaa, jotta voimme käyttää globaalia muuttujaa ja muokata sitä funktion paikallisesta laajuudesta. Mikä tahansa funktion ulkopuolelle luotu muuttuja on oletuksena globaali, kun taas Mikä tahansa funktion sisällä luotu muuttuja on oletusarvoisesti paikallinen. Näin ollen muuttuaksemme funktion sisällä olevaa kokonaismuuttujaa ja välttääksemme UnboundLocalError Voimme käyttää global – avainsanaa.

Katsotaanpa seuraavaa koodia, joka yksinkertaistaa edellä mainittua käsitettä:

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

tuloste:

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

Menetelmä 2: käyttämällä ei-paikallista avainsanaa

nonlocal avainsanaa käytetään, kun meillä on sisäkkäinen funktio. Tällaisessa tilanteessa muuttujan paikallista soveltamisalaa ei välttämättä määritellä, eli muuttujan soveltamisala ei ole paikallinen eikä globaali.

Katsotaanpa seuraavaa esimerkkiä ymmärtääksemme nonlocal – hakusanan käytön ongelmamme ratkaisemiseksi.

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

Lähtö

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

edellä mainitussa ohjelmassa nonlocal hakusanaa käytetään muuttujan val kanssa sisäkkäisen funktion foo() sisällä luomaan ei-lokaalinen muuttuja. Jos muuttujan nonlocal arvo muuttuu, muutokset näkyvät myös paikallismuuttujassa.

Disclaimer: nonlocal avainsana toimii vain Python 3: ssa ja sitä uudemmissa.

Menetelmä 3: Käyttämällä muunneltavaa kohdetta

koska nonlocal ei toimi Pythonin versioissa ennen Python 3: A, voit käyttää muunneltavaa kohdetta kuten python-sanakirjaa tallentaaksesi arvot, jos et halua luoda globaalia muuttujaa.

Katsotaanpa seuraavaa ohjelmaa, jotta ymmärtäisimme muunneltavan kappaleen käytön UnboundLocalErrorvoittamiseksi.

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

Menetelmä 4: parametrien siirtäminen funktiolle

tämä on perinteinen tapa ratkaista ongelmamme. Globaalin muuttujan sijaan voimme siirtää parametrit määritellylle funktiolle välttääksemme UnboundLocalError. Katsotaanpa seuraavaa koodia nähdäksemme, miten tämä voidaan tehdä:

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

tuloste:

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

Global Keyword vs Nonlocal Keyword

ennen kuin päätämme tämän artikkelin, tarkastelkaamme keskeisiä eroja global ja nonlocal muuttujan/avainsanat välillä.

  1. toisin kuin global hakusana, nonlocal hakusana toimii vain Python 3: ssa ja sitä uudemmissa.
  2. global hakusanaa voidaan käyttää ennestään olemassa olevien kokonaismuuttujien tai uusien muuttujien kanssa, kun taas nonlocal hakusana on määriteltävä jo olemassa olevan muuttujan kanssa.

johtopäätös

edellä mainitusta keskustelusta opimme, että käsitelläksemme UnboundLocalError koodissamme Voimme käyttää jotakin seuraavista menetelmistä:

  1. käytä global – hakusanaa.
  2. käytä nonlocal – avainsanaa sisäkkäisten funktioiden tapauksessa.
  3. käytä muunneltavaa esinettä.
  4. siirrä parametrit funktiolle.

toivon, että tästä artikkelista oli apua ja sen luettuasi voit käsitellä UnboundLocalError helposti. Olkaa hyvä ja odottakaa kiinnostavampia artikkeleita.

minne tästä eteenpäin?

riittää teoria, nyt harjoitellaan!

menestyäkseen koodaamisessa on lähdettävä ratkomaan oikeita ongelmia oikeille ihmisille. Näin kuusinumeroiseksi tienaajaksi pääsee helposti. Näin hiotaan taitoja, joita harjoituksissa oikeasti tarvitaan. Mitä hyötyä on oppimisteoriasta, jota kukaan ei koskaan tarvitse?

Harjoitusprojekteissa teroitetaan sahaa koodauksessa!

Haluatko tulla koodimestariksi keskittymällä käytännön koodiprojekteihin, joilla oikeasti tienaat rahaa ja ratkot ihmisten ongelmia?

ryhdy sitten Python freelance-kehittäjäksi! Se on paras tapa lähestyä tehtävää parantaa Python taitoja-vaikka olet täydellinen aloittelija.

liity ilmaiseen webinaariini ”How to Build Your High-Income Skill Python” ja katso, miten kasvatin koodausbisnekseni verkossa ja miten sinäkin voit—oman kotisi mukavuudesta.

liity ilmaiseen webinaariin nyt!