ProgrammatieBackend ontwikkelaar

Hoe werkt het mechanisme voor het doorgeven van parameters in Python (call by object reference / call by sharing)? Hoe beïnvloedt dit wijzigbare en onveranderlijke types, en hoe kun je ongewone wijzigingen voorkomen?

Slaag voor sollicitatiegesprekken met de Hintsage AI-assistent

Antwoord.

In Python worden parameters doorgegeven volgens het principe van 'call by object reference' (of 'call by sharing'). Dit betekent dat de functie een referentie naar het object ontvangt, en niet het object zelf. Als het object wijzigbaar (mutable) is, kan de inhoud ervan binnen de functie worden gewijzigd, en zullen de aanpassingen worden weerspiegeld in de externe variabele. Voor onveranderlijke objecten (immutable), zoals getallen of strings, leidt een wijziging binnen de functie tot het creëren van een nieuw object, zonder het originele object aan te tasten.

Voorbeeld van een wijzigbaar object:

def add_value(lst): lst.append(42) nums = [1, 2, 3] add_value(nums) print(nums) # [1, 2, 3, 42]

Voor een onveranderlijk object:

def add_value(num): num += 10 x = 5 add_value(x) print(x) # 5

Misleidende vraag.

Vraag: "Worden variabelen in Python doorgegeven aan functies via referentie of via waarde?"

Antwoord: Geen van beiden op de klassieke manier. De variabele geeft een referentie naar het object door, maar niet de variabele zelf, en je kunt het object voor de externe variabele niet vervangen.

Voorbeelden van echte fouten door onbekendheid met de nuances van het onderwerp.


Verhaal In een van de projecten voor het parseren van gegevens werd de functie gebruikt om een lijst te filteren. Binnen de functie werd geen nieuwe lijst gemaakt; de filtering vond plaats door wijzigingen aan te brengen in de oorspronkelijke lijst. Dit leidde tot het wissen van de oorspronkelijke gegevens - na meerdere uitvoeringen van het script waren er geen gegevens meer.


Verhaal Een junior ontwikkelaar dacht dat je strings "per referentie" binnen de functie kon wijzigen, omdat andere parameters (lijsten) konden worden aangepast. Hierdoor ontving het programma na het aanroepen van de functie niet de verwachte wijzigingen (de string veranderde niet), wat leidde tot onbegrijpelijke bugs.


Verhaal In de REST API voor het filteren van invoergegevens vergat de ontwikkelaar een kopie van de parameterdictionary te maken, en tijdens de validatie gingen waarden "verloren" - parameters werden uit het oorspronkelijke object verwijderd, wat de logica van latere aanvragen verstoorde.