Historique de la question :
Les dictionnaires (dict) sont l'un des types de données de base en Python, représentant une structure "clé-valeur". Les dictionnaires existent depuis la première version de Python, mais leur mise en œuvre interne et leurs comportements ont été constamment améliorés (par exemple, dans Python 3.7, l'ordre d'insertion est garanti).
Problème :
Comprendre la structure d'un dictionnaire est nécessaire pour écrire du code efficace. Sans connaissance des subtilités, des bogues peuvent survenir lors de l'utilisation de types mutables comme clés, lors de la copie de dictionnaires imbriqués, ainsi que lors d'opérations non standard.
Solution :
Un dictionnaire est implémenté comme une table de hachage, les clés doivent impérativement être hachables (immutable). L'accès à la valeur par la clé fonctionne proche de O(1), mais certaines conditions engendrent des particularités — par exemple, en cas de collisions ou lors du traitement de grandes quantités de données.
Exemple de code :
person = {'name': 'Alice', 'age': 30} person['city'] = 'Moscow' print(person['name']) # Alice
Caractéristiques clés :
Peut-on utiliser une liste (list) comme clé dans un dict ?
Non, les listes sont mutables et ne sont pas hachables. Tenter d'utiliser une liste entraînera une erreur.
d = {} d[[1, 2, 3]] = 'value' # TypeError: unhashable type: 'list'
Que se passe-t-il si l'on utilise deux tuples avec le même contenu comme clé ?
Si les deux tuples contiennent les mêmes données et sont eux-mêmes immuables, ils sont considérés comme égaux, et les clés dans le dictionnaire seront identiques :
t1 = (1, 2) t2 = (1, 2) d = {t1: 'a'} print(d[t2]) # 'a'
Le parcours des éléments du dictionnaire changera-t-il lors de la copie ?
Dans les versions Python 3.7+, l'ordre sera conservé. Dans les versions antérieures, l'ordre de parcours n'est pas garanti.
d1 = {'a': 1, 'b': 2} d2 = dict(d1) print(list(d2)) # ['a', 'b']
dict.get() sans vérification sur None peut conduire à des erreurs inattendues lorsque la valeur == None.Un programmeur stocke des listes comme clés, croyant à tort que tuple et list sont équivalents comme clés. Il reçoit des exceptions du type "unhashable type".
Avantages :
On peut rapidement essayer quelque chose "à la volée", utiliser n'importe quelle structure.
Inconvénients :
Erreurs d'exécution, bogues lors du traitement des données.
Seules des objets immuables (hachables) sont utilisés comme clés, les tuples sont conçus pour ne pas contenir d'éléments mutables.
Avantages :
Rapidité de recherche par clé, fiabilité de la structure, traitement et copie faciles.
Inconvénients :
Si les données sont complexes, un traitement supplémentaire est nécessaire pour convertir la structure en forme immuable (par exemple, sérialisation à l'intérieur du tuple).