ProgrammatiePython Backend Ontwikkelaar

Wat is de mutabiliteit (mutable/immutable) van objecten in Python? Hoe beïnvloedt dit de werking van functies en het doorgeven van parameters? Geef voorbeelden van typische fouten.

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

Mutabiliteit bepaalt of een object kan worden gewijzigd zonder de identificatie (adres in het geheugen) te veranderen:

  • Mutable objecten (bijvoorbeeld, list, dict, set) kunnen worden gewijzigd: elementen kunnen worden toegevoegd, gewijzigd of verwijderd.
  • Immutable objecten (bijvoorbeeld, int, str, tuple, frozenset) kunnen niet worden gewijzigd na creatie — alle "wijzigingen" creëren een nieuw object.

Invloed op functies:

  • Wanneer je een mutabel object aan een functie doorgeeft, kan de functie dit wijzigen.
  • Er zullen geen wijzigingen optreden met immutabele objecten, zelfs niet als je ze "vervangen" binnen de functie.

Voorbeeld:

def f(lst): lst.append(42) data = [] f(data) print(data) # [42] def f2(x): x += 1 n = 1 f2(n) print(n) # 1

Vraag met een valstrik.

"Wat zal de volgende code uitgeven?"

def foo(bar=[]): bar.append(1) return bar print(foo()) print(foo())

Antwoord: Geeft het volgende:

[1]
[1, 1]

Omdat de argumenten van de functie slechts één keer worden geïnitialiseerd bij de definitie, en niet bij elke aanroep. Lijsten (en andere mutabele objecten) in functieargumenten zijn een populaire valstrik.

Voorbeelden van echte fouten door gebrek aan kennis van de subtiliteiten van dit onderwerp.


Verhaal

In de REST API werd een lijst teruggegeven via een functie met een standaardparameter:

def get_default_items(items=[]): items.append('x') return items

Na enkele aanroepen ontdekten we dat de lijst groeide, terwijl we alleen één element verwachtten.


Verhaal

We wilden in een functie een string "veranderen":

def replace_word(word): word.replace('a', 'b') word = 'data' replace_word(word) print(word) # Verwachtte 'dbtb', kreeg 'data'

De str-methoden wijzigen de oorspronkelijke string niet, maar geven een nieuwe terug, maar de waarde van het teruggegeven resultaat werd genegeerd.


Verhaal

Bij het werken met geneste structuren:

original = [[1, 2], [3, 4]] copy = original[:] copy[0][0] = -1 print(original) # [[-1, 2], [3, 4]]

We gebruikten oppervlakkige kopieerroutine, denkend dat we alleen de kopie hadden gewijzigd, maar geneste objecten bleven gemeenschappelijk.