ProgramaciónDesarrollador Python

¿Qué es un diccionario (dict) en Python, cómo está estructurado internamente y en qué casos el tipo dict puede comportarse de manera no estándar?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

Historia de la pregunta:

Los diccionarios (dict) son uno de los tipos de datos básicos de Python, representan una estructura de "clave-valor". Los diccionarios han estado presentes desde la primera versión de Python, pero su implementación interna y características de comportamiento han sido perfeccionadas constantemente (por ejemplo, en Python 3.7 se garantiza el orden de inserción).

Problema:

Entender cómo está construido un diccionario es necesario para escribir código de manera eficiente. Sin conocimiento de los detalles, pueden surgir errores al usar tipos mutables como claves, al copiar diccionarios anidados, así como en operaciones no estándar.

Solución:

Un diccionario está implementado como una tabla hash, las claves deben ser necesariamente hashables (inmutables). El acceso a un valor mediante una clave funciona cerca de O(1), pero bajo ciertas condiciones pueden surgir particularidades, por ejemplo, en caso de colisiones o al trabajar con grandes volúmenes de datos.

Ejemplo de código:

person = {'name': 'Alice', 'age': 30} person['city'] = 'Moscú' print(person['name']) # Alice

Características clave:

  • Las claves deben ser inmutables y hashables (por ejemplo, str, int, tuple sin objetos mutables).
  • El diccionario en Python 3.7 y posteriores conserva el orden de inserción de los elementos.
  • dict es ideal para búsquedas, agregaciones y mapeos.

Preguntas capciosas.

¿Se puede usar una lista (list) como clave en dict?

No, las listas son mutables y no son hashables. Intentar usar una lista generará un error.

d = {} d[[1, 2, 3]] = 'valor' # TypeError: tipo no hashable: 'list'

¿Qué ocurre si se utilizan dos tuplas con el mismo contenido como clave?

Si ambas tuplas contienen los mismos datos y son inmutables, se consideran iguales y las claves en el diccionario coincidirán:

t1 = (1, 2) t2 = (1, 2) d = {t1: 'a'} print(d[t2]) # 'a'

¿Cambiará el orden de iteración de los elementos del diccionario al copiarlo?

En las versiones de Python 3.7 en adelante, el orden se mantendrá. En versiones anteriores, el orden de iteración no está garantizado.

d1 = {'a': 1, 'b': 2} d2 = dict(d1) print(list(d2)) # ['a', 'b']

Errores típicos y anti-patrones

  • Usar un tipo mutable como clave (por ejemplo, list o dict).
  • Errores al copiar: el operador simple = no crea una copia, sino que hace un nuevo "puntero" al mismo objeto.
  • Abusar de dict.get() sin verificar si es None puede llevar a errores inesperados si el valor == None.

Ejemplo de la vida real

Caso negativo

Un programador almacena listas como claves, pensando erróneamente que las tuplas y las listas son equivalentes como claves en Python. Recibe excepciones del tipo "tipo no hashable".

Ventajas:

Se puede intentar rápidamente algo "sobre la marcha", utilizando cualquier estructura.

Desventajas:

Errores en tiempo de ejecución, bugs en el procesamiento de datos.

Caso positivo

Se utilizan solo objetos inmutables (hashables) como claves, las tuplas están diseñadas para no contener elementos mutables.

Ventajas:

Rapidez de búsqueda por clave, fiabilidad de la estructura, fácil procesamiento y copia.

Desventajas:

Si los datos son complejos, se requiere procesamiento adicional para convertir la estructura a una forma inmutable (por ejemplo, serialización dentro de la tupla).