Ты не можешь изменять переменные замыкания простым присваиванием… — Библиотека Python разработчика | Книги по питону — TG.ME

Ты не можешь изменять переменные замыкания простым присваиванием.
Python рассматривает присваивание как определение локальной переменной внутри тела функции и вообще не делает замыкания.

Работает нормально, печатает 2:


def make_closure(x):
def closure():
print(x)

return closure

make_closure(2)()


Вызывает UnboundLocalError: local variable 'x' referenced before assignment:


def make_closure(x):
def closure():
print(x)
x *= 2
print(x)

return closure

make_closure(2)()


Чтобы это заработало, нужно использовать nonlocal.
Оно явно сообщает интерпретатору, что присваивание не создает новую локальную переменную, а работает с переменной из замыкания:


def make_closure(x):
def closure():
nonlocal x
print(x)
x *= 2
print(x)

return closure

make_closure(2)()


📲 Мы в MAX

👉@BookPython
t.me/BookPython/4086Translating to English…
🔥2
June 8, 2026 1.2K 1