Questão de Programação — Conceitos básicos de programação — Quadrix 2025
Programação›Conceitos 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.
A[‘X’][‘X’, ‘Y’][‘X’, ‘Y’, ‘Z’]
B[‘X’][‘Y’][‘Z’]
C[‘X’, ‘Y’, ‘Z’][‘X’, ‘Y’, ‘Z’][‘X’, ‘Y’, ‘Z’]
D[‘Z’][‘Z’, ‘Y’][‘Z’, ‘Y’, ‘X’]
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.
1def avalia default 1x
2Lista [] compartilhada
3append acumula itens
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.