összegzés: az UnboundLocalError
feloldásához, amikor a helyi változót az első használat után újra hozzárendelik, használhatja az global
vagy a nonlocal
kulcsszót. A global
kulcsszó lehetővé teszi a globális változó értékeinek módosítását egy függvény helyi hatókörén belül, míg a nonlocal
kulcsszó hasonló funkciókat biztosít beágyazott függvények esetén.
probléma: adott helyi változó. Hogyan lehet megoldani egy UnboundLocalError
értéket, amikor a helyi változót az első használat után újra hozzárendelik?
példa:
val = 100def func(): val = val + 100 print(val)func()
kimenet:
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
mielőtt a problémánk megoldásaival foglalkoznánk, meg kell értenünk a UnboundLocalError
mögött álló kiváltó okot.
az UnboundLocalErrors kiváltó oka:
ha egy változó egy függvényen belül van hozzárendelve, akkor a Python alapértelmezés szerint helyi változóként kezeli. Ha egy helyi változóra hivatkozunk, mielőtt egy értéket hozzárendelnénk/kötnénk hozzá, akkor UnboundLocalError
értéket emelünk. A fenti példában, amikor a 'val'
változót a Python tolmács olvassa a func()
függvényen belül, feltételezi, hogy a 'val'
helyi változó. Azonban hamarosan rájön, hogy a helyi változóra már hivatkoztak, mielőtt bármilyen értéket rendeltek volna hozzá a függvényen belül. Így dob egy UnboundLocalError
.
más szavakkal, csak egy függvényen belül férhetünk hozzá egy globális változóhoz, de nem módosíthatjuk azt a függvényen belül (hacsak nem kényszerítünk globális vagy nem helyi hozzárendelést a global
vagy nonlocal
kulcsszavak használatával).
Megjegyzés: Az összes Python kivétel szülőosztálya BaseException
. Az alábbi ábra a UnboundLocalError
kivételhierarchiáját mutatja.

most, hogy tudjuk, miért és amikor UnboundLocalError
emelkedik, vessünk egy pillantást a lehetséges megoldásokra a hiba leküzdésére.
Tartalomjegyzék
1. módszer: a
globális kulcsszó használata a global
kulcsszóval elérhetünk és módosíthatunk egy globális változót egy függvény helyi hatóköréből. Bármely függvényen kívül létrehozott változó alapértelmezés szerint globális, míg a függvényen belül létrehozott bármely változó alapértelmezés szerint helyi. Így a függvényen belüli globális változó módosításához és a UnboundLocalError
elkerüléséhez használhatjuk a global
kulcsszót.
vessünk egy pillantást a következő kódra, amely egyszerűsíti a fenti koncepciót:
val = 100print("Value at First Usage: ", val)def func(): global val val = val + 100 print("Output after Modification within func(): ", val)func()
kimenet:
Value at First Usage: 100Output after Modification within func(): 200
2. módszer: nem helyi kulcsszó használata
a nonlocal
kulcsszót akkor használjuk, ha beágyazott függvényünk van. Ilyen helyzetben előfordulhat, hogy a változó helyi hatóköre nem definiálható, vagyis a változó hatóköre sem helyi, sem globális.
nézzük meg a következő példát, hogy megértsük a nonlocal
kulcsszó használatát a problémánk kezelésére.
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
a fenti programban a nonlocal
kulcsszót a val
változóval együtt használják a foo()
beágyazott függvény belsejében egy nem helyi változó létrehozásához. Ha a nonlocal
változó értéke megváltozik, akkor a változások a helyi változóban is tükröződnek.
jogi nyilatkozat: a nonlocal
kulcsszó csak a Python 3 és újabb verzióiban működik.
3. módszer: Változtatható objektum használata
mivel a nonlocal
nem működik a Python 3 előtti verzióiban, használhat olyan változtatható objektumot, mint egy python szótár, az értékek tárolására, ha nem akar globális változót létrehozni.
vessünk egy pillantást a következő programra, hogy megértsük a változtatható objektum használatát a UnboundLocalError
leküzdése érdekében.
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
4. módszer: paraméterek átadása a
függvénynek ez a probléma megoldásának hagyományos módja. Globális változó használata helyett paramétereket adhatunk át a definiált függvénynek, hogy elkerüljük a UnboundLocalError
értéket. Vessünk egy pillantást a következő kódra, hogy lássuk, hogyan lehet ezt megtenni:
val = 100print("Value of val at first use: ", val)def func(v): v = v + 100 print("Output of val after modification:", v)func(val)
kimenet:
Value of val at first use: 100Output of val after modification: 200
globális kulcsszó vs Nem helyi kulcsszó
mielőtt befejeznénk ezt a cikket, vessünk egy pillantást a legfontosabb különbségekre a global
és nonlocal
változó/kulcsszavak között.
- az
global
kulcsszóval ellentétben anonlocal
kulcsszó csak a Python 3-as vagy újabb verzióiban működik. - az
global
kulcsszó használható már létező globális változókkal vagy új változókkal, míg anonlocal
kulcsszót egy már létező változóval kell meghatározni.
következtetés
a fenti megbeszélésből megtudtuk, hogy a kódunkban a UnboundLocalError
kezeléséhez a következő módszerek egyikét használhatjuk:
- használja a
global
kulcsszót. - beágyazott függvények esetén használja a
nonlocal
kulcsszót. - változékony objektum használata.
- paraméterek átadása egy függvénynek.
remélem, hogy hasznosnak találta ezt a cikket, és elolvasása után könnyedén kezelheti a UnboundLocalError
– ot. Kérjük, maradjon velünk további érdekes cikkekért.
Hová menjünk innen?
elég elmélet, menjünk egy kis gyakorlat!
ahhoz, hogy sikeres legyen a kódolásban, ki kell jutnia oda, és valódi problémákat kell megoldania valódi emberek számára. Így válhat egy hat számjegyű kereső könnyen. És így csiszolja meg azokat a készségeket, amelyekre valóban szüksége van a gyakorlatban. Végül is mi haszna a tanulási elméletnek, amelyre soha senkinek nincs szüksége?
gyakorlat projektek hogyan élesíteni a fűrész kódolás!
szeretne kódmesterré válni azáltal, hogy olyan gyakorlati kódprojektekre összpontosít, amelyek valóban pénzt keresnek és problémákat oldanak meg az emberek számára?
akkor legyen Python szabadúszó fejlesztő! Ez a legjobb módja annak, hogy megközelítse a Python készségek fejlesztésének feladatát—még akkor is, ha teljesen kezdő vagy.
Csatlakozz a “How to Build Your High-Income Skill Python” című ingyenes webináriumomhoz, és nézd meg, hogyan nőttem fel online a kódolási üzletemet, és hogyan tudsz te is—a saját otthonod kényelméből.
csatlakozzon az ingyenes webináriumhoz most!
Vélemény, hozzászólás?