Область видимости и lambda
Что это и зачем
Область видимости определяет, где доступно имя. Python ищет его по правилу LEGB: Local, Enclosing, Global, Builtins.
Как это работает
Присваивание внутри функции обычно создаёт локальное имя. global меняет привязку в модуле, nonlocal — в ближайшей внешней функции. Замыкание хранит доступ к внешней области. lambda создаёт функцию из одного выражения.
x = 10
def f():
x = 2
return x
print(f(), x)
Когда применять
lambda полезна для небольшого key в sorted, но сложное поведение лучше назвать через def. Передавайте зависимости аргументами. Замыкания удобны для фабрик небольшого поведения и сохранения состояния.
Границы применения
Избегайте global для бизнес-состояния. Замыкания в цикле захватывают имя, а не снимок текущего значения: при отложенном вызове все могут увидеть последнее значение. Для снимка используйте default или фабрику.
Ошибки и лучшие практики
Чтение имени до локального присваивания вызывает UnboundLocalError. nonlocal требует существующее имя внешней функции. lambda может вернуть значение, но не содержит обычные statements.
Понятна идея? Теперь проверим её в действии.