a = 10
def f():
print(1)
print(a) # UnboundLocalError raised here
a = 20
f()
Kod ten oczywiście podnosi UnboundLocalError: local variable 'a' referenced before assignment
. Ale dlaczego ten wyjątek został podniesiony na linii print(a)
?Dlaczego nieprawidłowe przypisanie do zmiennej globalnej powoduje podniesienie wyjątku wcześniej?
Jeśli interpreter wykonał kod linia po linii (jak myślałem, że to zrobił), to nie wiedziałby, że coś było nie tak po osiągnięciu print(a)
; po prostu myślę, że a
odnosi się do zmiennej globalnej.
Wygląda na to, że tłumacz odczytuje z góry całą funkcję, aby ustalić, czy do przypisania należy użyć a
. Czy to jest udokumentowane w dowolnym miejscu? Czy jest jakaś inna sytuacja, w której tłumacz patrzy w przyszłość (oprócz sprawdzania błędów składni)?
Wyjaśnienie, wyjątek sam w sobie jest całkowicie jasny: zmienne globalne można odczytać bez deklaracji global
, ale nie zostały napisane (ten projekt zapobiega błędom spowodowanym niezamierzoną modyfikacją zmiennych globalnych, te błędy są szczególnie trudne do debugowania, ponieważ prowadzą do błędów które występują z dala od lokalizacji błędnego kodu). Jestem tylko ciekawy, dlaczego wyjątek został zgłoszony wcześniej.
Myślę, że przekonasz się, że python nie może domyślnie uzyskać dostępu do zmiennych globalnych z funkcji wewnętrznych. Będziesz musiał wyraźnie zadeklarować, że chcesz używać globalnego. (btw Nie używaj globalnych zmiennych). – quamrana
@quamrana nieprawdziwe. Jeśli usuniesz przypisanie do lokalnego 'a', kod wypisze' 10'. – 2rs2ts
Co to jest warte, nie jest to specyficzne dla Pythona 3, tylko testowane w Pythonie 2 i to samo się dzieje. – 2rs2ts