Python Glossary English

все Python 3Функциипонятие

Замыкания

замыкания

Вложенная функция захватывает переменную из охватывающей области. Используется для фабрик функций и инкапсуляции состояния.

Синтаксис

def outer():
    x = 10
    def inner():
        return x
    return inner

Классическая ловушка: замыкание захватывает саму переменную, а не её значение в момент создания. Поэтому функции, созданные в цикле (lambda: i), все увидят последнее значение i — зафиксируйте его через аргумент по умолчанию (lambda i=i: i). А чтобы захваченную переменную не читать, а переприсваивать, во вложенной функции нужен nonlocal.

Примеры

def make_adder(n):
    def adder(x):
        return x + n
    return adder
add5 = make_adder(5)
print(add5(3))  # → 8
def make_multiplier(factor):
    def multiply(x):
        return x * factor
    return multiply
double = make_multiplier(2)
print(double(7))  # → 14
def counter():
    count = 0
    def inc():
        nonlocal count
        count += 1
        return count
    return inc
c = counter()
print(c(), c())  # → 1 2
def make_greeting(greeting):
    def greet(name):
        return f'{greeting}, {name}!'
    return greet
hello = make_greeting('Hello')
print(hello('Bob'))  # → Hello, Bob!
# Проверка замыкания
def outer():
    x = 'closure'
    def inner():
        return x
    return inner
f = outer()
print(f())  # → closure
# __closure__
def make_pow(n):
    def power(x):
        return x ** n
    return power
p = make_pow(3)
print(p(2))  # → 8
print(p.__closure__[0].cell_contents)  # → 3

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности