Переменные в Python могут использоваться до их установки. Это создаст ошибку времени выполнения, а не синтаксическую ошибку. Вот пример использования локальных переменных:
>>> def f():
... return a
... a = 3
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 2, in f
UnboundLocalError: local variable 'a' referenced before assignment
Это в отличие от языков, которые считают разыменование неназначенной или неопределенной переменной синтаксической ошибкой. Python не «захватывает» текущее состояние лексической области, он просто использует ссылки на изменяемые лексические области. Вот демонстрация:
>>> def f(): return a
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in f
NameError: global name 'a' is not defined
>>> a = 3
>>> f()
3