Pular para o conteúdo principal

Questão de Programação — Conceitos básicos de programação — Quadrix 2025

ProgramaçãoConceitos básicos de programação
Código
qg595985
Banca
Quadrix
Órgão
CRA-SP
Ano
2025
Nível
Superior
Cargo
Analista II - Desenvolvimento de Sistemas
Um desenvolvedor Python escreveu uma função para adicionar itens a uma lista, utilizando um parâmetro padrão. Considere‑se, então, o código a seguir.def adicionar_item(item, lista=[]):lista.append(item)print(lista)adicionar_item(“X”)adicionar_item(“Y”)adicionar_item(“Z”)Com base nessa situação hipotética, assinale a opção que apresenta a saída (output) que será impressa no console pela execução desse script.
  1. A[‘X’][‘X’, ‘Y’][‘X’, ‘Y’, ‘Z’]
  2. B[‘X’][‘Y’][‘Z’]
  3. C[‘X’, ‘Y’, ‘Z’][‘X’, ‘Y’, ‘Z’][‘X’, ‘Y’, ‘Z’]
  4. D[‘Z’][‘Z’, ‘Y’][‘Z’, ‘Y’, ‘X’]
  5. E[‘B’][‘A’, ‘B’]
Revelar gabarito e comentário

GabaritoA — [‘X’] [‘X’, ‘Y’] [‘X’, ‘Y’, ‘Z’]

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”.

Parâmetro padrão mutável em Python: o perigo da lista compartilhada

Gabarito: letra A. Em Python, o valor padrão de um parâmetro é avaliado uma única vez, no momento da definição da função — não a cada chamada. Assim, a lista [] é criada uma só vez e compartilhada entre todas as chamadas que não passam o argumento. Cada chamada a adicionar_item modifica a MESMA lista, acumulando os itens: ['X'], depois ['X', 'Y'], depois ['X', 'Y', 'Z']. Esse é o comportamento clássico de "default mutável" em Python, documentado na própria documentação oficial da linguagem.

O que está em jogo aqui é um dos conceitos mais traiçoeiros de Python: a avaliação única do argumento padrão. Quando você escreve def adicionar_item(item, lista=[]), o Python cria o objeto lista [] no momento em que a função é definida (quando o def é executado). Esse objeto fica "guardado" como o valor padrão. Em cada chamada adicionar_item("X"), como nenhum valor é passado para lista, o Python usa aquele mesmo objeto — não cria uma lista nova. Por isso, o append acumula.

Para entender por que isso acontece, é preciso lembrar que, em Python, tudo é objeto e que listas são objetos mutáveis. O parâmetro padrão é um atributo da função (acessível via adicionar_item.__defaults__), e ele aponta para o mesmo objeto lista durante toda a execução. Se o padrão fosse um tipo imutável (como None, int, str ou tuple), não haveria problema, pois a imutabilidade impede a modificação — mas a lista é mutável, então o append altera o próprio objeto padrão.

A consequência prática é que a função "lembra" do estado anterior entre chamadas. Isso é quase sempre um bug — o programador normalmente espera que cada chamada comece com uma lista vazia. A solução idiomática recomendada é usar None como padrão e criar a lista dentro da função:

def adicionar_item(item, lista=None):
    if lista is None:
        lista = []
    lista.append(item)
    print(lista)

Assim, cada chamada sem argumento cria uma lista nova, e o comportamento volta ao esperado: ['X'], ['Y'], ['Z'].

A pegadinha que a banca explora é exatamente essa: o candidato que não conhece a avaliação única do default tende a raciocinar como se cada chamada criasse uma lista nova (alternativa B), ou como se a lista fosse "resetada" a cada chamada. A alternativa A é a única que reflete o comportamento real do Python.

Guarde o critério decisivo: default mutável = objeto compartilhado entre chamadas. É exatamente essa a fronteira que separa a alternativa correta das demais.

  1. 1def avalia default 1x
  2. 2Lista [] compartilhada
  3. 3append acumula itens
  4. 4Saída: [X], [X,Y], [X,Y,Z]
LEVEL · soulevel.com.br

Alternativa A — ✅ Correta ⟵ GABARITO

Esta é a saída real do código. A lista padrão é criada uma única vez e compartilhada. Na primeira chamada, lista é [], recebe 'X' e imprime ['X']. Na segunda, a mesma lista agora contém 'X', recebe 'Y' e imprime ['X', 'Y']. Na terceira, contém 'X', 'Y', recebe 'Z' e imprime ['X', 'Y', 'Z']. O print dentro da função mostra o estado acumulado a cada chamada.

Alternativa B — ❌ Incorreta

Esta alternativa reflete o que o programador intuitivamente esperaria — que cada chamada criasse uma lista nova e imprimisse apenas o item recém-adicionado. Mas isso não acontece porque o default [] é avaliado uma única vez, na definição da função, e o mesmo objeto é reutilizado. A alternativa B seria correta se o código usasse lista=None e criasse a lista dentro da função, como no padrão idiomático.

Alternativa C — ❌ Incorreta

Esta alternativa mostra a mesma lista completa ['X', 'Y', 'Z'] impressa três vezes. Isso ocorreria se a função imprimisse a lista depois de todas as chamadas, ou se houvesse um único print no final do script. Mas o print está dentro da função e é executado a cada chamada, mostrando o estado da lista naquele momento — que cresce progressivamente. A alternativa C ignora o momento em que cada print é executado.

Alternativa D — ❌ Incorreta

Esta alternativa inverte a ordem dos elementos (['Z'], depois ['Z', 'Y'], depois ['Z', 'Y', 'X']). Isso não corresponde a nada no código: os itens são adicionados ao final da lista com append, na ordem X, Y, Z. A ordem inversa seria obtida com insert(0, item), que insere no início. A alternativa D mistura a ideia de acumulação com uma ordem que o código não produz.

Alternativa E — ❌ Incorreta

Esta alternativa mostra ['B'] e ['A', 'B'], que não têm relação com os itens do enunciado ('X', 'Y', 'Z'). Parece um distrator genérico, talvez copiado de outra questão, sem qualquer vínculo com o código apresentado. Não há como o código produzir essas saídas.

NÃO CAIA NESSA!

A banca explora a confusão entre o comportamento real do Python (default avaliado uma vez, lista compartilhada) e o comportamento intuitivo (cada chamada cria uma lista nova). O candidato que não conhece a avaliação única do default tende a marcar a alternativa B, que é o que "parece certo" mas não é o que o Python faz. A pegadinha está em saber que o [] do parâmetro é criado uma única vez, no def, e não a cada chamada.

PEGA ESSA DICA!

Na prova, ao ver um parâmetro padrão mutável ([], {}, set()), desconfie imediatamente: a questão quase sempre cobra o comportamento de compartilhamento entre chamadas. Trace a execução manualmente, chamada por chamada, anotando o estado da lista a cada print. E lembre-se da solução idiomática: use None como padrão e crie a lista dentro da função. Esse é um dos pontos mais cobrados de Python em concursos — vale a pena fixar.

Gabarito: letra A

Link permanente: /questoes/qg595985