Wanneer je Python gebruikt, zul je jezelf betrappen op het gebruik van my_list.pop() om het laatste item uit een lijst te verwijderen, of my_dict.pop('key') om een item uit een woordenboek te verwijderen. Je ontdekt dat je .pop() gebruikt op verschillende objecten.

Het voelt soms alsof pop() een universele instantie-methode is die aan elk object kan worden toegevoegd. Wat is de ware aard van deze pop() methode?


1. 'pop()' is niet één methode



Om met de conclusie te beginnen: de pop() van list en de pop() van dict zijn volledig verschillende methoden, ondanks dat ze dezelfde naam hebben.

  • De list klasse definieert zijn eigen pop() methode die geschikt is voor lijsten.

  • De dict klasse definieert eveneens zijn eigen pop() methode, passend voor woordenboeken.

  • Hetzelfde geldt voor de set klasse.

Het feit dat verschillende objecten dezelfde naam voor hun methode gebruiken, heeft veel te maken met het polymorfisme, een karakteristiek van de objectgeoriënteerde aard van Python. De naam 'pop' deelt enkel de gebruikelijke betekenis van "een item uit de datastructuur nemen (poppen) en teruggeven".


2. Verschillende manieren waarop pop() per klasse werkt

Dat ze dezelfde naam hebben betekent niet dat ze hetzelfde functioneren. Elke klasse heeft pop() geïmplementeerd volgens zijn eigen datastructuur.

1. list.pop([index])

  • Werking: Verwijdert het item op een specifieke index (index) uit de lijst en geeft dat item terug.

  • Kenmerk: Als er geen index wordt gespecificeerd, wordt de standaardwaarde -1 toegepast, wat het laatste item verwijdert. Dit is hetzelfde als de 'pop' operatie in een stapel (Stack) datastructuur.

  • Voorbeeld:

my_list = ['a', 'b', 'c']

# Geen index gespecificeerd (verwijdert laatste item 'c')
last_item = my_list.pop()
print(f"Returned value: {last_item}, remaining list: {my_list}")
# Output: Returned value: c, remaining list: ['a', 'b']

# Index 0 gespecificeerd ('a' verwijdert)
first_item = my_list.pop(0)
print(f"Returned value: {first_item}, remaining list: {my_list}")
# Output: Returned value: a, remaining list: ['b']

2. dict.pop(key[, default])

  • Werking: Verwijdert het item dat overeenkomt met een specifieke sleutel (key-value paar) uit het woordenboek en geeft de waarde terug.

  • Kenmerk: In tegenstelling tot list.pop(), moet de sleutel (key) absoluut worden opgegeven. Als de sleutel niet bestaat en er een default waarde is opgegeven, wordt die waarde teruggegeven, en als er geen default waarde is, ontstaat er een KeyError.

  • Voorbeeld:

my_dict = {'apple': 1, 'banana': 2}

# Verwijder sleutels 'apple'
item = my_dict.pop('apple')
print(f"Returned value: {item}, remaining dictionary: {my_dict}")
# Output: Returned value: 1, remaining dictionary: {'banana': 2}

# Probeer een ontbrekende sleutel ('grape') (default waarde 99 teruggeven)
default_item = my_dict.pop('grape', 99)
print(f"Returned value: {default_item}, remaining dictionary: {my_dict}")
# Output: Returned value: 99, remaining dictionary: {'banana': 2}

3. set.pop()

  • Werking: Verwijdert een willekeurig item uit een set (set) en geeft dat item terug.

  • Kenmerk: Aangezien een set een ongeordende datastructuur is, is het onvoorspelbaar welk item zal worden verwijderd. Er worden geen argumenten aan pop() doorgegeven.

  • Voorbeeld:

my_set = {10, 20, 30}

# Willekeurig item verwijderen (wat eruit komt is onbekend)
item = my_set.pop()
print(f"Returned value: {item}, remaining set: {my_set}")
# Mogelijke output 1: Returned value: 10, remaining set: {20, 30}
# Mogelijke output 2: Returned value: 20, remaining set: {10, 30}

3. Reden waarom het "overal plakt"



Wanneer we pop() gebruiken, denken we terecht dat het iets lijkt op een instantie-methode. De pop() behoort daadwerkelijk tot elke specifieke object (instantie).

Het betekent echter niet dat pop() een globale functie is of gedefinieerd is in de bovenklasse van alle objecten, wanneer het eruitziet als obj.pop(). In Python controleert obj.method() dynamisch of het object obj een eigenschap (methode) heeft met de naam method.

  • my_list is een instantie van de list klasse, en de list klasse heeft pop gedefinieerd.

  • my_dict is een instantie van de dict klasse, en de dict klasse heeft ook pop gedefinieerd.

Dit verklaart waarom zowel my_list.pop() als my_dict.pop() beide functioneren.

Wat gebeurt er als we proberen de pop() methode aan te roepen op een object dat deze methode niet heeft gedefinieerd? Zoals verwacht zal er een AttributeError optreden. Laten we als voorbeeld een tuple bekijken.

# Tuple (tuple) kan niet worden gewijzigd, dus er is geen pop() methode.
my_tuple = (1, 2, 3)

# AttributeError: 'tuple' object has no attribute 'pop'
my_tuple.pop() 

Een infographic die de pop() methode in Python over drie datastructuren illustreert

Samenvatting

  1. pop() is geen globale functie of een gemeenschappelijke methode in Python.

  2. list, dict, set zijn methoden die afzonderlijk zijn gedefinieerd door elk van de containerklassen.

  3. De reden waarom ze dezelfde naam hebben is omdat ze de conventionele betekenis delen van "data ophalen en retourneren".

  4. De manier waarop ze werken verschilt per klasse, dus list verwijdert op index, dict op sleutel en set verwijdert willekeurig een item.