Podsumowanie: aby rozwiązać UnboundLocalError , gdy zmienna lokalna zostanie ponownie przypisana po pierwszym użyciu, możesz użyć słowa kluczowego global lub nonlocal. Słowo kluczowe global umożliwia modyfikowanie wartości zmiennej globalnej z lokalnego zakresu funkcji, podczas gdy słowo kluczowe nonlocal zapewnia podobną funkcjonalność w przypadku funkcji zagnieżdżonych.

Problem: podano zmienną lokalną. Jak rozwiązać UnboundLocalError , gdy zmienna lokalna jest przypisywana po pierwszym użyciu?

przykład:

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

wyjście:

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

zanim zajmiemy się rozwiązaniami naszego problemu, musimy zrozumieć podstawową przyczynę UnboundLocalError.

główna przyczyna Nieboundlocalerrors:

gdy zmienna jest przypisana do funkcji, domyślnie jest traktowana jako zmienna lokalna w Pythonie. Jeśli zmienna lokalna jest odwoływana przed przypisaniem/powiązaniem do niej wartości, jest wywoływana wartość UnboundLocalError . W powyższym przykładzie, gdy zmienna 'val' jest odczytywana przez interpreter Pythona wewnątrz funkcji func(), zakłada ona, że 'val' jest zmienną lokalną. Jednak szybko zdaje sobie sprawę, że zmienna lokalna została odwołana, zanim jakakolwiek wartość została przypisana do niej w funkcji. W ten sposób wyrzuca UnboundLocalError.

innymi słowy, możemy uzyskać dostęp tylko do zmiennej globalnej wewnątrz funkcji, ale nie możemy jej modyfikować z poziomu funkcji (chyba że wymusisz globalne lub nielokalne przypisanie za pomocą słów kluczowych global lub nonlocal).

Uwaga: klasą nadrzędną wszystkich wyjątków Pythona jest BaseException. Poniższy diagram przedstawia hierarchię WYJĄTKÓW UnboundLocalError.

hierarchia WYJĄTKÓW UnboundLocalError

teraz, gdy wiemy, dlaczego i kiedy podniesiono UnboundLocalError , przyjrzyjmy się prawdopodobnym rozwiązaniom, aby przezwyciężyć ten błąd.

spis treści

Metoda 1: używając globalnego słowa kluczowego

możemy użyć słowa kluczowego global , aby uzyskać dostęp i zmodyfikować zmienną globalną z lokalnego zakresu funkcji. Każda zmienna tworzona poza funkcją jest domyślnie globalna, podczas gdy każda zmienna tworzona wewnątrz funkcji jest domyślnie lokalna. Tak więc, aby zmodyfikować zmienną globalną z poziomu funkcji i uniknąć UnboundLocalError, możemy użyć słowa kluczowego global.

przyjrzyjmy się poniższemu kodowi, który upraszcza powyższą koncepcję:

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

wyjście:

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

Metoda 2: Użycie nielokalnego słowa kluczowego

słowo kluczowe nonlocal jest używane, gdy mamy zagnieżdżoną funkcję. W takiej sytuacji lokalny zakres zmiennej może nie być zdefiniowany, tzn. zakres zmiennej nie jest ani lokalny, ani globalny.

przyjrzyjmy się poniższemu przykładowi, aby zrozumieć użycie słowa kluczowego nonlocal do rozwiązania naszego problemu.

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

wyjście

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

w powyższym programie, słowo kluczowe nonlocal jest używane ze zmienną val wewnątrz funkcji zagnieżdżonej foo(), aby utworzyć zmienną nielokalną. Jeśli wartość zmiennej nonlocal ulegnie zmianie, zmiany zostaną odzwierciedlone również w zmiennej lokalnej.

Zastrzeżenie: słowo kluczowe nonlocal działa tylko w Pythonie 3 i nowszym.

Metoda 3: Używanie Mutowalnego obiektu

ponieważ nonlocal nie działa w wersjach Pythona przed Pythonem 3, możesz użyć mutowalnego obiektu, takiego jak słownik Pythona, do przechowywania wartości, jeśli nie chcesz tworzyć zmiennej globalnej.

przyjrzyjmy się poniższemu programowi, aby zrozumieć użycie zmiennego obiektu w celu przezwyciężenia 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: przekazywanie parametrów do funkcji

jest to tradycyjny sposób rozwiązania naszego problemu. Zamiast używać zmiennej globalnej, możemy przekazać parametry do zdefiniowanej funkcji, aby uniknąć UnboundLocalError. Rzućmy okiem na poniższy kod, aby zobaczyć, jak można to zrobić:

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

wyjście:

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

Globalne słowo kluczowe vs nielokalne słowo kluczowe

przed zakończeniem tego artykułu, rzućmy okiem na kluczowe różnice między global i nonlocal zmienna/słowa kluczowe.

  1. w przeciwieństwie do słowa kluczowego global, słowo kluczowe nonlocal działa tylko w Pythonie 3 i nowszym.
  2. słowo kluczowe global może być używane z istniejącymi zmiennymi globalnymi lub nowymi zmiennymi, podczas gdy słowo kluczowe nonlocal musi być zdefiniowane z istniejącą zmienną.

wniosek

z powyższej dyskusji dowiedzieliśmy się, że do radzenia sobie z UnboundLocalError w naszym kodzie możemy użyć jednej z następujących metod:

  1. Użyj słowa kluczowego global .
  2. Użyj słowa kluczowego nonlocal w przypadku funkcji zagnieżdżonych.
  3. użyj zmiennego obiektu.
  4. przekaż parametry do funkcji.

mam nadzieję, że ten artykuł okazał się pomocny, a po jego przeczytaniu z łatwością poradzisz sobie z UnboundLocalError. Zapraszamy do zapoznania się z ciekawymi artykułami.

co dalej?

wystarczy teorii, poćwiczmy!

aby odnieść sukces w kodowaniu, musisz wyjść i rozwiązać prawdziwe problemy dla prawdziwych ludzi. W ten sposób możesz łatwo stać się sześciocyfrowym zarabiaczem. I w ten sposób szlifujesz umiejętności, których naprawdę potrzebujesz w praktyce. W końcu, jaki jest pożytek z teorii uczenia się, której nikt nigdy nie potrzebuje?

Practice projects to jak wyostrzyć piłę w kodowaniu!

czy chcesz zostać mistrzem kodu, koncentrując się na praktycznych projektach kodu, które faktycznie zarabiają pieniądze i rozwiązują problemy dla ludzi?

zostań freelancerem w Pythonie! Jest to najlepszy sposób podejścia do zadania poprawy swoich umiejętności Pythona—nawet jeśli jesteś kompletnym początkującym.

Dołącz do mojego bezpłatnego webinarium „Jak zbudować swój wysoki dochód umiejętności Python” i zobacz, jak rozwijam mój biznes kodowania online i jak ty możesz-w zaciszu własnego domu.

Dołącz do bezpłatnego webinarium już teraz!