Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] Erro no código do Pyhton

Pessoal, estou tentando criar uma função simples que adiciona um item a uma lista. Se eu não passar uma lista, ela deveria criar uma nova (vazia) e adicionar o item.

Porém, o resultado está sendo cumulativo! Vejam o que aparece no console:

Esperado: ['Cereja'] na terceira chamada.

Obtido: ['Maçã', 'Banana', 'Cereja']

Por que o Python está 'lembrando' dos itens anteriores se eu não passei a lista de volta?

def adicionar_item(nome_item, lista=[]):
    lista.append(nome_item)
    return lista

# Testando a função
print(f"Primeira chamada: {adicionar_item('Maçã')}")
print(f"Segunda chamada: {adicionar_item('Banana')}")
print(f"Terceira chamada: {adicionar_item('Cereja')}")
1 resposta
solução!

Oi, Luiz!

Esse é um dos comportamentos mais curiosos do Python e acontece porque você está usando um objeto mutável (uma lista) como argumento padrão da função.

O que está acontecendo:
No Python, os argumentos padrão são avaliados apenas uma única vez, no momento em que a função é definida (quando o script é carregado), e não toda vez que a função é chamada.

Como a lista [] é criada na definição, o Python reserva um espaço na memória para ela. Toda vez que você chama a função sem passar uma lista nova, o interpretador usa sempre aquela mesma instância que foi criada lá no início. Por isso os itens vão se acumulando.

Como resolver:

Você pode usar None como valor padrão e inicializar a lista dentro da função. Assim, uma nova lista é criada em cada chamada:

def adicionar_item(nome_item, lista=None):
    # se a lista não for fornecida, criamos uma nova dentro da chamada atual
    if lista is None:
        lista = []
    
    lista.append(nome_item)
    return lista

# agora o teste funciona como esperado:
print(adicionar_item('Maçã'))   # ['Maçã']
print(adicionar_item('Banana')) # ['Banana']
print(adicionar_item('Cereja')) # ['Cereja']

Dessa forma, você garante que cada chamada tenha seu próprio escopo e sua própria lista limpa!

Espero ter ajudado.

Um abraço e bons estudos.