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
itemelista=Nonecomo parâmetros. - Se
listaforNone, 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
- Definimos
adicionar_itemcomitemelista=None. ONoneé um valor imutável e seguro como padrão. - Dentro da função, verificamos se
listaéNone. Se for, criamos uma nova lista vazia com[]. - Adicionamos
itemà lista comappend. - Retornamos a lista modificada.
- Na primeira chamada sem lista, uma nova lista é criada e retorna
['a']. - Na segunda chamada sem lista, outra nova lista é criada e retorna
['b']. - Na terceira chamada, passamos
minha_listaque 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 deis:if lista == Nonefunciona, 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']