devterview_$ iniciar simulação

Cenário: argumento default mutável

MédioPlenoPegadinhas da linguagem

Pergunta

Por que `def add(item, lista=[]): lista.append(item); return lista` se comporta de forma inesperada quando chamada várias vezes sem passar `lista`?

Resposta esperada

O valor default é avaliado UMA vez, quando a função é definida, não a cada chamada. Então existe uma única lista compartilhada entre todas as chamadas que omitem o argumento: a primeira chamada retorna `[a]`, a segunda `[a, b]`, e assim por diante — o estado vaza entre chamadas. A correção idiomática é `def add(item, lista=None): if lista is None: lista = []` — assim uma lista nova nasce a cada chamada. Vale pra qualquer default mutável (list, dict, set) e é uma das pegadinhas mais cobradas em entrevista de Python.

Por que perguntam isso

Cenário pleno. Quem já levou esse bug em produção responde na hora e sabe o remédio (`=None`). Quem nunca viu costuma insistir que 'deveria começar vazia toda vez'.

#default-mutavel#pegadinhas#escopo
publicidade

Relacionadas