Explicación de la tarea de Python con entrevistas de trabajo.

¡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]) .

PS

Si 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 .

Source: https://habr.com/ru/post/459518/


All Articles