Saudação, Khabrovites! Antecipando o lançamento de um novo tópico no curso
"Desenvolvedor Web em Python" , queremos compartilhar uma nova tradução útil. Vamos lá!
Tendo ido a várias entrevistas
novamente e aprovado nas tarefas de teste, notei que os entrevistadores gostam de tarefas como as seguintes.
def f(x, l=[]): for i in range(x): l.append(i * i) return l >>> f(2) >>> f(3, [0, 1, 2]) >>> f(3)
Pergunta: O que esse código produzirá?
A saída das duas primeiras linhas é bastante óbvia, mas o resultado da terceira linha
f(3)
não me pareceu tão direto. Vamos ver o que acontece depois que a função
f
inicializada. Para executar esse código, usarei o
IPython .
>>> f <function __main__.f(x, l=[])> >>> f.__defaults__ ([],)
A lista vazia que vemos do resultado da execução de
f.__defaults__
é a variável
l
no código da função.
>>> f(2) [0, 1]
Nada de especial.
>>> f <function __main__.f(x, l=[0, 1])> >>> f.__defaults__ ([0, 1],)
No entanto! Agora vemos que a variável
l
tem o valor
[0, 1]
devido à variabilidade do objeto de lista no Python e passando os argumentos da função como referência.
>>> f(3, [0, 1, 2]) [0, 1, 2, 0, 1, 4] >>> f <function __main__.f(x, l=[0, 1])>
Nada de especial também. Apenas passando o objeto de
list
como uma variável
l
.
>>> f(3) [0, 1, 0, 1, 4] >>> f <function __main__.f(x, l=[0, 1, 0, 1, 4])>
E agora o mais interessante. Quando você executa
f(3)
, o Python não usa a lista vazia definida no código da função, usa a variável
l
com os valores de
f.__defaults__ ([0, 1])
.
PSSe você precisar de uma função que utilize uma lista vazia após cada chamada, deverá usar algo parecido com isto (defina o valor de
'l'
para
'None'
).
def f(x, l=None): if l is None: l = [] for i in range(x): l.append(i * i) return l >>> f(2) [0, 1] >>> f(3, [0, 1, 2]) [0, 1, 2, 0, 1, 4] >>> f(3) [0, 1, 4]
Conclusão
Então, eu criei uma das tarefas de teste mais populares para uma entrevista. Este post pretende mostrar que você nem sempre pode confiar em sua intuição, como eu faço por conta própria :-).
Esperamos que esta tradução seja útil para você. Tradicionalmente, estamos aguardando comentários e nos vemos no
curso .