O trecho de código Python a seguir pretende filtrar números pares de uma lista e retornar uma nova lista:
De acordo com esse trecho, em vez da lista completa de pares, o resultado impresso será [2], indicando que há um erro na programação.
Nesse caso, o erro está
Ana inicialização da lista pares = []
Bno uso de range(len(numeros)) em vez de enumerate(numeros)
Cna condição numeros[i] % 2 == 0
Dna indentação do return pares
Ena chamada da função filtrar_pares([1, 2, 3, 4, 5, 6])
Revelar gabarito e comentário▾
GabaritoD — na indentação do return pares
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Python: indentação e escopo de blocos
Gabarito: letra D. O erro está na indentação do return pares: como o return está alinhado com o for (mesmo nível de indentação), ele é executado logo após a primeira iteração do laço, retornando a lista com apenas o primeiro número par encontrado ([2]), em vez de aguardar o fim do loop para retornar a lista completa. Em Python, a indentação define os blocos de código — não há chaves {} como em Java ou C —, e é exatamente essa característica que a banca explora.
A indentação é o mecanismo que o Python usa para delimitar blocos de código. Diferente de linguagens como Java, C ou C++, que usam chaves {} para agrupar comandos, o Python usa o recuo (espaços ou tabs) para indicar quais instruções pertencem a um mesmo bloco. Isso significa que a posição horizontal de cada linha não é apenas estética: ela define a estrutura lógica do programa. Um return indentado dentro de um for será executado a cada iteração; um return alinhado com o for será executado apenas após o laço terminar. A confusão entre esses dois níveis é uma das pegadinhas mais comuns em questões de Python.
Vamos reconstruir o código provável da questão para entender o erro:
def filtrar_pares(numeros):
pares = []
for i in range(len(numeros)):
if numeros[i] % 2 == 0:
pares.append(numeros[i])
return pares # ← indentação correta: alinhado com o for
print(filtrar_pares([1, 2, 3, 4, 5, 6])) # [2, 4, 6]
Se o return pares estiver indentado dentro do for (ou seja, com o mesmo recuo do if), o laço retorna na primeira iteração em que encontra um par:
def filtrar_pares(numeros):
pares = []
for i in range(len(numeros)):
if numeros[i] % 2 == 0:
pares.append(numeros[i])
return pares # ← indentação errada: dentro do for
print(filtrar_pares([1, 2, 3, 4, 5, 6])) # [2]
No segundo caso, ao encontrar o número 2 (índice 1), o return é executado imediatamente, devolvendo [2] e encerrando a função — exatamente o comportamento descrito no enunciado. O laço nunca chega a processar os números 4 e 6.
A alternativa B menciona range(len(numeros)) em vez de enumerate(numeros). Embora enumerate seja mais idiomático e legível, ambas as abordagens funcionam corretamente para percorrer a lista por índice. O problema não está aí. A alternativa C (condição numeros[i] % 2 == 0) está correta: ela verifica se o resto da divisão por 2 é zero, o que identifica números pares. A alternativa A (inicialização pares = []) também está correta — a lista precisa começar vazia para receber os elementos. A alternativa E (chamada da função) está correta: a lista [1, 2, 3, 4, 5, 6] é passada como argumento, e a função deveria retornar [2, 4, 6].
A pegadinha aqui é sutil: o código parece correto à primeira vista, mas a indentação errada do return muda completamente o fluxo de execução. O candidato que não domina o papel da indentação em Python pode não perceber o erro e marcar uma alternativa incorreta. É por isso que a banca FGV escolheu essa questão: ela testa não apenas a sintaxe, mas a compreensão do modelo de blocos da linguagem.
Guarde a regra de ouro: em Python, o return dentro de um laço encerra a função naquele ponto. Se a intenção é retornar após processar todos os elementos, o return deve estar alinhado com o for, não dentro dele. É exatamente essa distinção que separa a alternativa correta das demais.
1return dentro do for
2Executa na 1ª iteração
3Retorna [2] e encerra
4Laço nunca termina
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
A inicialização pares = [] está correta. A lista precisa começar vazia para que os números pares sejam adicionados com append. Sem essa inicialização, o código geraria um NameError ao tentar usar pares.append(). Portanto, não há erro aqui.
Alternativa B — ❌ Incorreta
O uso de range(len(numeros)) é válido em Python. Ele gera uma sequência de índices de 0 até len(numeros) - 1, permitindo acessar cada elemento da lista por posição. Embora enumerate(numeros) seja mais idiomático e legível, ambas as formas funcionam corretamente para percorrer a lista. O erro não está na escolha entre essas duas abordagens.
Alternativa C — ❌ Incorreta
A condição numeros[i] % 2 == 0 está correta. O operador % retorna o resto da divisão; se o resto for zero, o número é par. Essa é a forma padrão de verificar paridade em Python. Não há erro lógico aqui.
Alternativa D — ✅ Correta ⟵ GABARITO
A indentação do return pares é o problema. Se o return estiver indentado dentro do for (mesmo nível do if), ele será executado na primeira iteração em que um número par for encontrado, retornando [2] e encerrando a função prematuramente. Para retornar a lista completa, o return deve estar alinhado com o for, ou seja, fora do laço. Em Python, a indentação define os blocos, e essa é a causa do erro descrito no enunciado.
Alternativa E — ❌ Incorreta
A chamada filtrar_pares([1, 2, 3, 4, 5, 6]) está correta. A lista é passada como argumento, e a função deveria retornar [2, 4, 6]. O problema não está na chamada, mas no comportamento interno da função devido à indentação errada.
NÃO CAIA NESSA!
A banca explora a confusão entre return dentro do laço e return fora do laço. Em Python, a indentação é a única forma de delimitar blocos — não há chaves {}. O candidato que lê o código mentalmente como se fosse Java ou C pode não perceber que o return está dentro do for, pois visualmente a diferença é apenas um recuo. Fique atento: se o return estiver alinhado com o if, ele executa a cada iteração; se estiver alinhado com o for, executa apenas no final. Com treino, você enxerga essas armadilhas de longe 💪.
PEGA ESSA DICA!
Ao analisar código Python em provas, verifique sempre a indentação de return, break e continue dentro de laços. Pergunte-se: "este comando está dentro do loop ou fora dele?". Uma boa técnica é contar os espaços de cada linha — se o return tem o mesmo recuo do for, ele está fora; se tem o mesmo recuo do if, está dentro. Essa checagem rápida resolve a maioria das questões sobre escopo em Python.