Closures e Escopo
LEGB, nonlocal e funções aninhadas
Closures são funções que "lembram" o ambiente onde foram criadas, capturando variáveis do escopo externo mesmo após esse escopo ter terminado de executar. São fundamentais para criar fábricas de funções e decorators.
Python usa a regra LEGB para resolver nomes de variáveis: Local → Enclosing (escopos aninhados) → Global → Built-in. A palavra-chave nonlocal permite modificar variáveis do escopo externo imediato, e global permite modificar variáveis do escopo de módulo.
Closures permitem criar funções especializadas a partir de funções genéricas, encapsulando estado sem precisar de classes.
# Closure básica
def criar_multiplicador(fator):
def multiplicar(x):
return x * fator # captura 'fator' do escopo externo
return multiplicar
dobrar = criar_multiplicador(2)
triplicar = criar_multiplicador(3)
print(dobrar(5)) # 10
print(triplicar(5)) # 15
# nonlocal — modifica variável do escopo externo
def criar_contador():
contagem = 0
def incrementar():
nonlocal contagem
contagem += 1
return contagem
return incrementar
c = criar_contador()
print(c()) # 1
print(c()) # 2
print(c()) # 3
# global — modifica variável de módulo
total = 0
def adicionar(n):
global total
total += n
adicionar(10)
adicionar(5)
print(total) # 15Closures que capturam variáveis de loop devem usar parâmetro padrão (def f(x=x):) para evitar capturar a referência da variável ao invés do valor.