ProgrammatiePython ontwikkelaar

Wat is een dictionary (dict) in Python, hoe is het onder de motorkap opgebouwd, en in welke gevallen kan het dict-type ongebruikelijk gedrag vertonen?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Geschiedenis van de vraag:

Dictionaries (dict) zijn een van de basis datatypes in Python, die een structuur van “sleutel-waarde” vertegenwoordigen. Dictionaries bestaan al sinds de eerste versie van Python, maar hun interne implementatie en gedrag zijn voortdurend verbeterd (bijvoorbeeld, in Python 3.7 is de volgorde van invoer gegarandeerd).

Probleem:

Begrip van de opbouw van een dictionary is noodzakelijk voor effectieve codering. Zonder kennis van de nuances kunnen er bugs ontstaan bij het gebruik van mutabele types als sleutels, bij het kopiëren van geneste dictionaries, en ook bij ongebruikelijke operaties.

Oplossing:

Een dictionary is geïmplementeerd als een hash-tabel, sleutels moeten noodzakelijkerwijs hashbaar (immutable) zijn. Toegang tot de waarde via de sleutel werkt bijna in O(1), maar onder bepaalde omstandigheden ontstaan er bijzonderheden — bijvoorbeeld, bij botsingen of het werken met grote hoeveelheden gegevens.

Voorbeeldcode:

persoon = {'naam': 'Alice', 'leeftijd': 30} persoon['stad'] = 'Moskou' print(persoon['naam']) # Alice

Belangrijke kenmerken:

  • Sleutels moeten onveranderlijk en hashbaar zijn (bijvoorbeeld, str, int, tuple zonder mutabele objecten).
  • Dict in Python 3.7 en later behoudt de volgorde van invoer van elementen.
  • dict is uitstekend voor zoeken, aggregaties, en mappings.

Misleidende vragen.

Kan een lijst (list) als sleutel in een dict worden gebruikt?

Nee, lijsten zijn mutabel en niet hashbaar. Proberen om een lijst te gebruiken zal een fout veroorzaken.

d = {} d[[1, 2, 3]] = 'waarde' # TypeError: unhashable type: 'list'

Wat gebeurt er als twee tuples met dezelfde inhoud als sleutel worden gebruikt?

Als beide tuples dezelfde gegevens bevatten en zelf onveranderlijk zijn, worden ze als gelijk beschouwd, en de sleutels in de dictionary zullen overeenkomen:

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

Zal de volgorde van de elementen in de dictionary veranderen bij het kopiëren?

In Python 3.7+ zal de volgorde behouden blijven. In oudere versies is de volgorde van iteratie niet gegarandeerd.

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

Typische fouten en anti-patronen

  • Gebruik van een mutabel type als sleutel (bijvoorbeeld, list of dict).
  • Fouten bij het kopiëren: de eenvoudige operator = maakt geen kopie, maar creëert een nieuwe "pointer" naar hetzelfde object.
  • Gebruik van dict.get() zonder controle op None kan leiden tot onverwachte fouten, als de waarde == None.

Voorbeeld uit het leven

Negatieve case

Een programmeur slaat lijsten op als sleutels, in de veronderstelling dat tuple en list in Python als sleutels gelijkwaardig zijn. Ontvangt uitzonderingen van het type "unhashable type".

Voordelen:

Je kunt snel iets "uitproberen", elke structuur gebruiken.

Nadelen:

Runtime-fouten, bugs bij gegevensverwerking.

Positieve case

Alleen onveranderlijke (hashbare) objecten worden als sleutels gebruikt, tuples zijn zodanig ontworpen dat ze geen mutabele elementen bevatten.

Voordelen:

Snelheid bij zoeken op sleutel, betrouwbaarheid van de structuur, gemakkelijke verwerking en kopiëren.

Nadelen:

Als de gegevens complex zijn, is aanvullende verwerking vereist om de structuur in een onveranderlijke vorm te brengen (bijvoorbeeld, serialisatie binnen een tuple).