¡Saludo, Khabrovites! En previsión del lanzamiento de un nuevo hilo en el curso
"Desarrollador web en Python" , queremos compartir una nueva traducción útil. Vamos!
Después de
volver a varias entrevistas y aprobar las tareas de prueba, noté que a los entrevistadores les gustan tareas como las siguientes.
def f(x, l=[]): for i in range(x): l.append(i * i) return l >>> f(2) >>> f(3, [0, 1, 2]) >>> f(3)
Pregunta: ¿Qué generará este código?
El resultado de las dos primeras líneas es bastante obvio, pero el resultado de la tercera línea
f(3)
no me pareció tan sencillo. Veamos qué sucede después de que
f
inicializa la función
f
. Para ejecutar este código,
usaré IPython .
>>> f <function __main__.f(x, l=[])> >>> f.__defaults__ ([],)
La lista vacía que vemos en el resultado de la ejecución de
f.__defaults__
es la variable
l
en el código de función.
>>> f(2) [0, 1]
Nada especial
>>> f <function __main__.f(x, l=[0, 1])> >>> f.__defaults__ ([0, 1],)
Sin embargo! Ahora vemos que la variable
l
tiene el valor
[0, 1]
debido a la variabilidad del objeto de lista en Python y pasando los argumentos de la función como referencia.
>>> f(3, [0, 1, 2]) [0, 1, 2, 0, 1, 4] >>> f <function __main__.f(x, l=[0, 1])>
Nada especial tampoco. Simplemente pasando el objeto de la
list
como una variable
l
.
>>> f(3) [0, 1, 0, 1, 4] >>> f <function __main__.f(x, l=[0, 1, 0, 1, 4])>
Y ahora lo más interesante. Cuando ejecuta
f(3)
, Python no usa la lista vacía que está definida en el código de función, usa la variable
l
con los valores de
f.__defaults__ ([0, 1])
.
PSSi necesita una función que use una lista vacía después de cada llamada, debe usar algo como esto (establezca el valor de
'l'
en
'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]
Conclusión
Así que hice una de las tareas de prueba más populares para una entrevista. Sin embargo, esta publicación pretende mostrar que no siempre puede confiar en su intuición, como lo hago yo solo :-).
Esperamos que esta traducción le sea útil. Tradicionalmente, esperamos comentarios y nos vemos en el
curso .