0Pricing
Python Academy · Aula

nonlocal e estado mutável

Modifique o escopo envolvente

nonlocal e estado mutável é uma aula grátis de Python Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Python Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Python Academy inclui 4 aulas no total.

Lendo e escrevendo variáveis envolventes

Uma função interna pode ler livremente uma variável envolvente, mas, se tentar atribuir algo a esse nome, o Python o trata como uma nova variável local. Isso costuma surpreender iniciantes.

def outer():
    count = 0
    def inner():
        return count
    return inner()
print(outer())

A armadilha da atribuição

Atribuir algo a um nome envolvente sem declarar essa intenção faz com que ele seja local, portanto a variável externa nunca é atualizada. Aqui, a alteração é perdida.

def outer():
    count = 0
    def bump():
        count = count + 1
    try:
        bump()
    except UnboundLocalError as e:
        print('Error:', e)
outer()

A palavra-chave nonlocal

nonlocal declara que um nome se refere a uma variável na função envolvente mais próxima, fazendo com que as atribuições atualizem essa variável externa em vez de criar uma local.

def outer():
    count = 0
    def bump():
        nonlocal count
        count += 1
    bump()
    bump()
    return count
print(outer())

Um fechamento contador

Com nonlocal, você pode criar um contador com estado. Cada chamada altera a variável capturada e se lembra do progresso.

def make_counter():
    count = 0
    def increment():
        nonlocal count
        count += 1
        return count
    return increment
c = make_counter()
print(c())
print(c())
print(c())

Contadores independentes

Cada contador mantém seu próprio estado porque cada fechamento captura uma variável separada.

def make_counter():
    count = 0
    def inc():
        nonlocal count
        count += 1
        return count
    return inc
a = make_counter()
b = make_counter()
print(a(), a(), b())

nonlocal versus global

nonlocal atua no escopo de uma função envolvente, enquanto global atua no nível do módulo. Use nonlocal para fechamentos e global para o estado de todo o módulo.

total = 0
def add_global(n):
    global total
    total += n
add_global(5)
add_global(3)
print(total)

Estado mutável sem nonlocal

Se o valor envolvente for um objeto mutável, como uma lista ou um dicionário, você poderá alterá-lo diretamente sem nonlocal, pois não está reassociando o nome.

def make_logger():
    history = []
    def log(msg):
        history.append(msg)
        return history
    return log
log = make_logger()
log('start')
print(log('stop'))

Um acumulador

Combinar nonlocal com um fechamento produz um acumulador contínuo que adiciona cada valor a um total lembrado.

def make_accumulator():
    total = 0
    def add(n):
        nonlocal total
        total += n
        return total
    return add
acc = make_accumulator()
print(acc(10))
print(acc(5))
print(acc(100))

Um alternador simples

nonlocal facilita alternar um estado booleano entre chamadas.

def make_toggle():
    on = False
    def toggle():
        nonlocal on
        on = not on
        return on
    return toggle
t = make_toggle()
print(t(), t(), t())

Redefinindo o estado

Você pode disponibilizar várias funções internas que compartilham o mesmo estado envolvente, por exemplo, uma para adicionar e outra para redefinir.

def make_bank():
    balance = 0
    def deposit(n):
        nonlocal balance
        balance += n
        return balance
    def reset():
        nonlocal balance
        balance = 0
        return balance
    return deposit, reset
deposit, reset = make_bank()
print(deposit(50))
print(reset())

nonlocal precisa de uma variável existente

nonlocal exige que o nome já exista em um escopo envolvente; caso contrário, o Python gera um SyntaxError no momento da definição. Ele não pode criar uma nova variável externa.

def outer():
    value = 'set'
    def inner():
        nonlocal value
        value = 'changed'
    inner()
    return value
print(outer())

Verificação rápida

Dentro de uma função aninhada, você quer reassociar uma variável da função envolvente. Qual palavra-chave deve usar?

Recapitulação: nonlocal e estado mutável

Resumo:

  • Atribuir algo a um nome envolvente normalmente cria uma nova variável local; nonlocal impede isso.
  • nonlocal atua no escopo da função envolvente; global atua no módulo.
  • Alterar um objeto mutável diretamente não exige nenhuma declaração.
  • Fechamentos com nonlocal criam contadores, acumuladores e alternadores que preservam o estado.
def make_counter():
    n = 0
    def inc():
        nonlocal n
        n += 1
        return n
    return inc
c = make_counter()
print(c(), c())

Perguntas Frequentes

A aula “nonlocal e estado mutável” é grátis?

Sim — o texto completo de “nonlocal e estado mutável” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Python Academy, atualize para CoddyKit PRO. O curso de Python Academy inclui 4 aulas no total.

O que vou aprender em “nonlocal e estado mutável”?

Modifique o escopo envolvente Você pratica Python Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Python Academy?

Nenhuma experiência prévia é necessária. Python Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “nonlocal e estado mutável”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Python Academy?

Sim. Cada aula de Python Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Funções de primeira classe
  2. Closures e variáveis livres
  3. nonlocal e estado mutável
  4. Funções parciais
← Voltar para Python Academy