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
, но не написаны (этот проект предотвращает ошибки из-за непреднамеренно изменяющихся глобальных переменных; эти ошибки особенно сложно отлаживать, поскольку они приводят к ошибки, которые происходят далеко от местоположения ошибочного кода). Мне просто интересно, почему исключение поднимается раньше.