Entrevistas de Python backend cobrem detalhes internos da linguagem, programação assíncrona, Django ou FastAPI, e padrões de acesso a banco de dados. Abaixo estão as perguntas mais comuns com respostas modelo. Junior: teoria básica, definições e casos práticos simples.
1
Qual é a diferença entre uma lista e uma tupla, e quando isso importa?
Resposta
Listas são mutáveis, tuplas não, e a consequência que as pessoas esquecem é que a imutabilidade torna as tuplas hasheáveis — então uma tupla pode ser chave de dicionário e uma lista não. Use uma tupla quando o tamanho e o significado de cada posição são fixos, como uma coordenada ou uma linha de banco de dados, e uma lista quando você está coletando itens do mesmo tipo. Uma tupla também sinaliza intenção: diz ao leitor que ninguém vai dar append nisso.
2
O que acontece se você usar um objeto mutável como argumento default?
Resposta
O default é avaliado uma vez, quando a função é definida, não a cada chamada — então um default de lista ou dict é compartilhado entre todas as chamadas e acumula estado entre elas. A solução é usar None como default e construir o objeto dentro do corpo da função. Esse é o bug de Python mais comum que sobrevive a um code review, porque a função parece correta quando olhada isoladamente.
3
Qual é a diferença entre is e ==?
Resposta
== pergunta se dois objetos têm o mesmo valor; is pergunta se são o mesmo objeto na memória. Eles coincidem por acidente para inteiros pequenos e strings curtas porque o CPython os cacheia, por isso o erro passa despercebido até um valor crescer além do cache. A regra na prática: use is só para None, True e False, e == para tudo o resto.
4
Explique como um dicionário encontra uma chave.
Resposta
Ele faz o hash da chave para escolher um bucket, depois compara por igualdade para resolver colisões dentro daquele bucket. Duas consequências decorrem disso: a chave precisa ser hasheável, por isso uma lista não pode ser uma; e se você sobrescrever __eq__ numa classe, precisa sobrescrever __hash__ também, ou instâncias que comparam iguais vão cair em buckets diferentes e se comportar errado em sets e dicts.
5
Qual é a diferença entre uma list comprehension e uma generator expression?
Resposta
Uma comprehension entre colchetes constrói a lista inteira na memória imediatamente; a mesma expressão entre parênteses retorna um generator que produz elementos um de cada vez. Para um milhão de linhas, a primeira aloca um milhão de objetos e a segunda aloca um de cada vez. Use o generator quando você itera uma vez, e a comprehension quando precisa do resultado mais de uma vez ou precisa do seu tamanho.
6
O que cada um de try / except / else / finally faz?
Resposta
try contém o código arriscado, except trata uma exceção específica, else roda só se nada foi lançado, e finally roda em qualquer caso e é onde entra a limpeza. O else existe para manter o bloco try o menor possível — código que não pode falhar não pertence ali, porque um except amplo acabaria engolindo erros de linhas que você nunca quis proteger.
7
O que *args e **kwargs fazem?
Resposta
*args coleta argumentos posicionais extras numa tupla, **kwargs coleta argumentos nomeados extras num dict. São o que permite um wrapper aceitar qualquer assinatura e repassá-la sem alterações, por isso todo decorator que você escrever vai usá-los. Abusar deles em funções comuns esconde a assinatura real de quem lê o código e dos type checkers.