a = 10
def f():
print(1)
print(a) # UnboundLocalError raised here
a = 20
f()
Этот код, конечно, поднимает UnboundLocalError: local variable 'a' referenced before assignment. Но почему это исключение возникает в строке print(a)?
Если интерпретатор выполнил код по строкам (как я думал, он это сделал), он не знал бы, что что-то было не так, когда print(a) было достигнуто; он просто подумал бы, что a ссылается на глобальную переменную.
Итак, кажется, что интерпретатор заранее читает всю функцию, чтобы выяснить, используется ли a для назначения. Является ли это документированным где угодно? Есть ли другой случай, когда интерпретатор смотрит вперед (кроме проверки на синтаксические ошибки)?
Чтобы прояснить, само исключение совершенно ясно: глобальные переменные могут быть прочитаны без объявления global, но не написаны (этот проект предотвращает ошибки из-за непреднамеренно изменяющихся глобальных переменных; эти ошибки особенно сложно отлаживать, поскольку они приводят к ошибки, которые происходят далеко от местоположения ошибочного кода). Мне просто интересно, почему исключение поднимается раньше.