Médio Python

Lista segura com valor padrão mutável

Enunciado

Crie uma função adicionar_item que receba um item e uma lista opcional. Se a lista não for fornecida, crie uma nova lista vazia a cada chamada. A função deve adicionar o item à lista e retorná-la. Teste chamando a função duas vezes sem passar lista e depois passando uma lista existente. Imprima os resultados.

Requisitos

  • A função deve ter item e lista=None como parâmetros.
  • Se lista for None, criar uma nova lista dentro da função.
  • A função deve modificar e retornar a lista.
  • As duas primeiras chamadas sem lista devem retornar listas independentes (ex.: ['a'] e ['b']).

Código inicial

def adicionar_item(item, lista=None):
    # Complete a função
    pass

# Teste as chamadas

Saída esperada

['a']
['b']
['c', 'd']
Ver dica

Use if lista is None: para criar uma nova lista. Não use lista=[] como padrão, pois isso compartilha a mesma lista entre chamadas.

Mostrar solução
def adicionar_item(item, lista=None):
    """Adiciona item à lista. Se lista não for fornecida, cria uma nova."""
    if lista is None:
        lista = []
    lista.append(item)
    return lista

# Chamadas sem lista
print(adicionar_item("a"))
print(adicionar_item("b"))

# Chamada com lista existente
minha_lista = ["c"]
print(adicionar_item("d", minha_lista))

Passo a passo

  1. Definimos adicionar_item com item e lista=None. O None é um valor imutável e seguro como padrão.
  2. Dentro da função, verificamos se lista é None. Se for, criamos uma nova lista vazia com [].
  3. Adicionamos item à lista com append.
  4. Retornamos a lista modificada.
  5. Na primeira chamada sem lista, uma nova lista é criada e retorna ['a'].
  6. Na segunda chamada sem lista, outra nova lista é criada e retorna ['b'].
  7. Na terceira chamada, passamos minha_lista que já contém 'c', então adicionamos 'd' e retornamos ['c', 'd'].

Por que funciona

O valor padrão None é avaliado uma única vez, mas como é imutável, não há efeito colateral. Dentro da função, criamos uma nova lista a cada chamada quando necessário. Isso evita o problema clássico de compartilhar a mesma lista mutável entre chamadas.

Erros comuns

  • Usar lista=[] como padrão: def adicionar_item(item, lista=[]): faz com que a mesma lista seja reutilizada, acumulando itens indesejados.
  • Esquecer o return: a função modificaria a lista mas não a retornaria, dificultando o uso.
  • Comparar com == em vez de is: if lista == None funciona, mas o idiomático é if lista is None.

Outra forma de resolver

Usar lista = lista or [] é conciso, mas falha se a lista passada for vazia (pois [] é falso). Prefira a verificação explícita com is None.

Saída esperada

['a']
['b']
['c', 'd']