Библиотека Python разработчика | Книги по питону
18.3K subscribers
1.05K photos
403 videos
82 files
1.16K links
Погружение в CPython и архитектуру. Разбираем неочевидное поведение (GIL, Memory), Best Practices (SOLID, DDD) и тонкости Django/FastAPI. Решаем задачи с подвохом и оптимизируем алгоритмы. 🐍

По всем вопросам @evgenycarter

РКН clck.ru/3Ko7Hq
Download Telegram
Ты не можешь изменять переменные замыкания простым присваиванием.
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
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2