Pular para o conteúdo principal

Questão de Programação — Conceitos básicos de programação — FGV 2026

ProgramaçãoConceitos básicos de programação
Código
fg128594
Banca
FGV
Órgão
AMAZUL
Ano
2026
Nível
Superior
Cargo
Analista de Desenvolvimento de Sistemas
Considere o seguinte código Python:Q59.png 229×100A saída produzida pelo código é:
  1. A[0, 1, 2]
  2. B[2, 2, 2]
  3. C[0, 0, 0]
  4. DNameError: name 'i' is not defined
  5. E[3, 3, 3]
Revelar gabarito e comentário

GabaritoB — [2, 2, 2]

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: escopo de variável em list comprehension

Gabarito: letra B. O código produz [2, 2, 2] porque, em Python, a variável de iteração de uma list comprehension vaza para o escopo externo após a execução (comportamento das versões 2.x e 3.x, embora em 3.x o vazamento seja limitado à variável de iteração). Assim, após o loop, i vale o último valor do range, que é 2, e a lista [i, i, i] é criada com esse valor. A alternativa B é a única que reflete esse comportamento.

A list comprehension é uma construção sintática do Python que permite criar listas de forma concisa, aplicando uma expressão a cada elemento de um iterável. A sintaxe básica é [expressão for item in iterável]. O que muitas vezes passa despercebido é o escopo da variável de iteração (item). Em Python 2, a variável vazava para o escopo externo e permanecia com o último valor após a execução. Em Python 3, o vazamento foi corrigido para a maioria dos casos, mas a variável de iteração ainda vaza quando a list comprehension é executada no escopo global ou de função — ela fica com o último valor atribuído. Isso é diferente de, por exemplo, um for tradicional, onde a variável também permanece após o loop, mas a list comprehension é frequentemente vista como uma expressão "isolada", o que gera confusão.

Vamos analisar o código (que não foi transcrito, mas é o padrão clássico):

lista = [i for i in range(3)]
print([i, i, i])

Aqui, a list comprehension [i for i in range(3)] itera sobre range(3), que gera os valores 0, 1 e 2. Durante a execução, a variável i assume cada um desses valores. Ao final, i fica com o último valor, que é 2. Em seguida, a expressão [i, i, i] cria uma lista com três referências ao valor atual de i, ou seja, [2, 2, 2]. Se a list comprehension não tivesse sido executada antes, i não estaria definida e ocorreria um NameError — mas como ela foi executada, i existe e vale 2.

A pegadinha clássica é o candidato achar que i é uma variável local da list comprehension e que, fora dela, não existe — o que levaria à alternativa D. Ou achar que a lista [i, i, i] é criada com os valores 0, 1 e 2 (alternativa A), confundindo com o que a list comprehension geraria se fosse impressa diretamente. A alternativa C ([0, 0, 0]) seria o resultado se i fosse reinicializada para 0 após o loop, o que não acontece. A alternativa E ([3, 3, 3]) seria se range(3) fosse interpretado como 1, 2, 3 (o que não é, pois range(3) vai de 0 a 2).

Guarde o critério decisivo: após uma list comprehension, a variável de iteração mantém o último valor do iterável no escopo externo. É exatamente isso que separa a alternativa correta das demais.

Alternativa A — ❌ Incorreta

[0, 1, 2] seria a saída se o código imprimisse a própria list comprehension (print([i for i in range(3)])). Mas o código imprime [i, i, i] depois da list comprehension, quando i já está com o último valor (2). A alternativa confunde o conteúdo da list comprehension com o valor final da variável de iteração.

Alternativa B — ✅ Correta ⟵ GABARITO

Após a execução da list comprehension [i for i in range(3)], a variável i fica com o último valor do range, que é 2. A expressão [i, i, i] então cria uma lista com três cópias desse valor, resultando em [2, 2, 2]. Esse é o comportamento real do Python.

Alternativa C — ❌ Incorreta

[0, 0, 0] seria o resultado se i fosse reinicializada para 0 após o loop, o que não ocorre. A alternativa ignora que i mantém o último valor atribuído durante a iteração.

Alternativa D — ❌ Incorreta

NameError: name 'i' is not defined ocorreria se a list comprehension não tivesse sido executada antes da linha print([i, i, i]). Como ela foi executada, i está definida no escopo externo com o valor 2. A alternativa é a pegadinha clássica para quem acredita que a variável de iteração é local à list comprehension.

Alternativa E — ❌ Incorreta

[3, 3, 3] seria o resultado se range(3) fosse interpretado como 1, 2, 3 (o que não é — range(3) gera 0, 1, 2). O último valor seria 3, mas na verdade é 2. A alternativa confunde o limite superior do range com o último valor gerado.

NÃO CAIA NESSA!

A banca explora a confusão entre o escopo da variável de iteração e o conteúdo da list comprehension. Muitos candidatos acham que i é uma variável local e que, fora da list comprehension, ela não existe — caindo na alternativa D. Outros acham que [i, i, i] é criado com os valores 0, 1 e 2 (alternativa A), confundindo com o que a list comprehension geraria. Lembre-se: em Python, a variável de iteração vaza para o escopo externo e mantém o último valor. Com treino, você enxerga essa pegadinha de longe 💪.

PEGA ESSA DICA!

Para questões de list comprehension, sempre verifique se a variável de iteração é usada fora da expressão. Se for, ela terá o último valor do iterável. Teste mental: [i for i in range(3)]i vale 2 após a execução. Se a questão pedir a saída de print([i, i, i]), a resposta é [2, 2, 2]. Se pedir print([i for i in range(3)]), a resposta é [0, 1, 2]. Essa distinção é o ponto-chave.

Gabarito: letra B

Link permanente: /questoes/fg128594