Python/Funções/Closures e Escopo
Python⏱ ~2 min de leitura

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.

Exemplo.java
# 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)  # 15
💡 Dica pro

Closures 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.

Recompensa+35 XP+exercícios