Argumentos padrão são avaliados uma vez, quando a função é definida, não a cada chamada. Uma lista ou dict padrão é, portanto, um único objeto compartilhado que persiste entre todas as chamadas, então mutações se acumulam e vazam entre chamadores. A correção é usar None como padrão e criar um container novo dentro do corpo quando o argumento for None.
Por que os entrevistadores perguntam isso
É uma checagem rápida para ver se você entende que uma instrução def executa e liga objetos em tempo de definição. Os entrevistadores gostam porque a resposta errada é confiante e específica: as pessoas insistem que a lista é recriada a cada chamada. Também abre a porta para falar da diferença entre ligar um nome e copiar um valor, que está por trás de muitas surpresas do Python.
Como estruturar sua resposta
- Diga que padrões são avaliados uma vez, em tempo de definição.
- Explique a consequência do objeto compartilhado.
- Dê a correção com o sentinela None.
- Note que padrões imutáveis são seguros.
Exemplo de resposta
Porque o objeto padrão é criado uma vez, quando o Python executa a instrução def, e depois toda chamada que omite o argumento recebe aquele mesmo objeto. Se for uma lista e a função der append nela, a terceira chamada enxerga o que a primeira e a segunda deixaram para trás. Peguei isso num helper de cache que recebia um dict vazio de opções por padrão. Num worker de vida longa o dict cresceu por dias e no fim um request herdou configurações de um tenant sem relação nenhuma, o que não é um bug divertido de explicar. A correção é sem graça: padrão None, e aí dentro do corpo você checa explicitamente por None e monta um dict novo, para que um dict vazio passado de propósito continue sendo respeitado. Padrões imutáveis como inteiros, strings ou None são tranquilos porque nada pode mutá-los. O Ruff sinaliza isso como B006 já de fábrica, então é um daqueles bugs que nunca deveriam chegar ao review num projeto com lint plugado no CI.
Vai encarar essa entrevista em breve? O GhostPilot escuta a sua chamada ao vivo, identifica a pergunta no instante em que ela é feita e coloca uma resposta estruturada na sua tela em tempo real. Teste na sua próxima entrevista simulada ou pegue um Session Pass de $29, sem assinatura, para a hora da verdade.
Veja como funcionaPerguntas de acompanhamento que você pode esperar
- Por que usar or em vez de uma checagem explícita de None é arriscado?
- Tuplas são seguras como padrão?
- Onde mais a avaliação em tempo de definição surpreende as pessoas?
Mais perguntas para Desenvolvedor Python
Seu entrevistador vai fazer a própria versão desta. Cole a descrição real da vaga no Question Predictor gratuito e receba as 20 perguntas que essa vaga tem mais chance de fazer, com o que cada uma está de fato sondando.
Prever minhas perguntas