Замыкание — это вложенная функция, которая захватывает и запоминает переменные из своей внешней области видимости, даже после того как внешняя функция завершила выполнение.
def outer(x):
def inner(y):
return x + y
return inner
add_five = outer(5)
add_five(3) # Returns 8
outer возвращает функцию inner без её вызоваinner сохраняет доступ к x даже после того, как outer вернуласьadd_five(3) всё ещё "помнит", что x = 5Замыкания в Python захватывают переменные по ссылке, а не по значению. Это означает, что замыкание обращается к текущему значению переменной во время вызова, а не во время определения.
def outer():
x = 10
def inner():
return x
x = 20 # x обновляется после определения inner
return inner
outer()() # Returns 20, not 10
Захваченные переменные хранятся в атрибуте __closure__ функции:
add_five.__closure__[0].cell_contents # Returns 5
Поскольку переменные захватываются по ссылке, замыкания внутри циклов могут дать неожиданные результаты, если переменная цикла изменяется. Стандартное решение — использовать аргумент по умолчанию, чтобы явно захватить значение:
funcs = [lambda x, i=i: x + i for i in range(3)]
Python closures захватывают переменные по ссылке, то есть они получают доступ к текущему значению переменной в момент вызова closure, а не в момент его определения.
Новый — ещё не проверен сообществом
Вы