Las entrevistas de Python backend cubren internos del lenguaje, programación async, Django o FastAPI, y patrones de acceso a base de datos. Aquí están las preguntas más comunes con respuestas modelo. Junior: teoría básica, definiciones y casos prácticos simples.
1
¿Cuál es la diferencia entre una lista y una tupla, y cuándo importa?
Respuesta
Las listas son mutables, las tuplas no, y la consecuencia que la gente olvida es que la inmutabilidad hace hasheables a las tuplas — así que una tupla puede ser una clave de diccionario y una lista no. Usa una tupla cuando el tamaño y significado de cada posición son fijos, como una coordenada o una fila de base de datos, y una lista cuando estás recolectando elementos del mismo tipo. Una tupla también señala intención: le dice al lector que nadie va a hacer append a esto.
2
¿Qué pasa si usas un objeto mutable como argumento default?
Respuesta
El default se evalúa una vez, cuando la función se define, no en cada llamada — así que un default de lista o dict se comparte entre todas las llamadas y acumula estado entre ellas. La solución es poner None como default y construir el objeto dentro del cuerpo. Este es el bug de Python más común que sobrevive al code review, porque la función se ve correcta de forma aislada.
3
¿Cuál es la diferencia entre is y ==?
Respuesta
== pregunta si dos objetos tienen el mismo valor; is pregunta si son el mismo objeto en memoria. Coinciden por accidente para enteros pequeños y strings cortos porque CPython los cachea, por eso el error pasa desapercibido hasta que un valor crece más allá del caché. La regla en la práctica: usa is solo para None, True y False, y == para todo lo demás.
4
Explica cómo un diccionario encuentra una clave.
Respuesta
Hashea la clave para elegir un bucket, luego compara con igualdad para resolver colisiones dentro de ese bucket. Se siguen dos consecuencias: la clave debe ser hasheable, por eso una lista no puede serlo, y si sobreescribes __eq__ en una clase debes sobreescribir __hash__ también, o instancias que comparan igual caerán en buckets distintos y se comportarán incorrectamente en sets y dicts.
5
¿Cuál es la diferencia entre una list comprehension y una generator expression?
Respuesta
Una comprehension entre corchetes construye toda la lista en memoria inmediatamente; la misma expresión entre paréntesis devuelve un generador que produce elementos de a uno. Para un millón de filas la primera asigna un millón de objetos y la segunda asigna de a uno. Usa el generador cuando iteras una vez y la comprehension cuando necesitas el resultado más de una vez o necesitas su longitud.
6
¿Qué hace cada uno de try / except / else / finally?
Respuesta
try contiene el código riesgoso, except maneja una excepción específica, else corre solo si no se lanzó nada, y finally corre en cualquier caso y es donde va la limpieza. else existe para que el bloque try se mantenga lo más pequeño posible — código que no puede fallar no pertenece ahí, porque un except amplio entonces tragaría errores de líneas que nunca quisiste proteger.
7
¿Qué hacen *args y **kwargs?
Respuesta
*args recolecta argumentos posicionales extra en una tupla, **kwargs recolecta argumentos de palabra clave extra en un dict. Son lo que permite que un wrapper acepte cualquier firma y la pase sin cambios, por eso cada decorador que escribas los usa. Abusar de ellos en funciones ordinarias esconde la firma real de los lectores y de los type checkers.