Powód nieintuicyjnego zachowania UnboundLocalError

Uwaga: istnieje bardzo podobne pytanietutaj. Znoś się ze mną; moje pytanie nie brzmi „Dlaczego błąd się zdarza”, ale „Dlaczego Python zaimplementował błąd, aby w tym przypadku popełnić błąd”.

Natknąłem się na to:

a = 5
def x()
    print a
    a = 6
x()

rzucaUnboundLocalException. Teraz wiem, dlaczego tak się dzieje (później w tym zakresie,a jest związany, więca jest uważany za lokalny w całym zakresie).

W tym przypadku:

a = 5
def x()
    print b
    b = 6
x()

to ma bardzo sens. Ale pierwszy przypadek ma w sobie intuicyjną logikę, co ma oznaczać:

a = 5
def x()
    print globals()["a"]
    a = 6 # local assignment
x()

Sądzę, że jest powód, dla którego „wstępna” wersja nie jest dozwolona, ​​ale co to jest? Chociaż może to być przypadek „Wyraźny jest lepszy niż ukryty”, bawi się zglobals() zawsze wydaje mi się trochę nieczysty.

Aby spojrzeć na to z perspektywy, rzeczywisty przypadek, w którym mi się to przytrafiło, był skryptem innej osoby, który musiałem zmienić na chwilę. W mojej (krótkotrwałej) zmianie dokonałem zmiany nazwy pliku podczas działania skryptu, więc wstawiłem

import os
os.rename("foo", "bar")

do skryptu. To wstawianie stało się wewnątrz funkcji. Moduł już zaimportowanyos na najwyższym poziomie (nie sprawdziłem tego), a niektóreos.somefunction połączenia wykonywane wewnątrz funkcji, ale przed moją wstawką. Te połączenia oczywiście wywołałyUnboundLocalException.

Czy więc ktoś może wyjaśnić mi przyczyny tego wdrożenia? Czy ma to zapobiegać błędom użytkownika? Czy „intuicyjny” sposób sprawi, że kompilator kodu bajtowego będzie bardziej skomplikowany? A może istnieje jakaś niejednoznaczność, o której nie pomyślałem?

questionAnswers(3)

yourAnswerToTheQuestion