Por que um argumento padrão mutável vaza estado em Python
Um argumento padrão em Python é avaliado uma vez, quando a função é definida, e não a cada chamada. Se esse padrão for uma lista mutável, toda chamada que omite o argumento compartilha a mesma lista.
A resposta rápida
Não use um valor mutável, como uma lista, como argumento padrão. Use None e crie uma lista nova dentro da função quando nenhum argumento for fornecido.
Um exemplo mínimo
def record(label, history=[]):
history.append(label)
return historydef record(label, history=None):
if history is None:
history = []
history.append(label)
return historyNa versão com bug, duas chamadas sem o argumento opcional adicionam itens à mesma lista, então os resultados se acumulam. A verificação de None cria uma lista própria para cada chamada.
Como depurar
- Chame a função duas vezes seguidas sem passar o argumento opcional.
- Se o segundo resultado contém dados da primeira chamada, o valor padrão está sendo compartilhado.
- Procure um padrão mutável: uma lista, dict ou set na assinatura.
- Substitua por None e construa o contêiner dentro da função.
Correções erradas comuns
- Limpar a lista no início da função, o que muta um objeto compartilhado que outros podem estar segurando.
- Copiar o padrão dentro da função mas manter o padrão mutável na assinatura.
- Usar uma tupla como padrão e depois tentar dar append nela.
Limites deste guia
Este é o caso clássico de padrão mutável. Armadilhas relacionadas incluem atributos de classe mutáveis e caches compartilhados. O desafio foca na versão de argumento padrão para que a causa seja inequívoca.
Referências oficiais
Pronto para experimentar?
Corrigir este bug em um desafio grátisPáginas relacionadas
O bug do await ausente em funções async do JavaScript
Um await ausente faz o JavaScript ler uma Promise como se fosse o valor resolvido. Veja a falha, a correção de uma linha e as correções erradas a evitar.
Por que um JOIN duplica linhas e como corrigir a cardinalidade
Um JOIN um-para-muitos multiplica linhas, então um cliente com vários pedidos aparece várias vezes. Aprenda a diagnosticar cardinalidade e agregar no grão certo.
Guias
Guias curtos de depuração que explicam um bug comum, mostram uma correção mínima e abrem um desafio grátis correspondente. Navegue pelos guias por linguagem.