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;
nonlocalimpede isso. nonlocalatua no escopo da função envolvente;globalatua no módulo.- Alterar um objeto mutável diretamente não exige nenhuma declaração.
- Fechamentos com
nonlocalcriam 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
- Funções de primeira classe
- Closures e variáveis livres
- nonlocal e estado mutável
- Funções parciais