In Python werden Parameter nach dem Prinzip 'call by object reference' (oder 'call by sharing') übergeben. Das bedeutet, dass die Funktion einen Verweis auf das Objekt erhält, nicht das Objekt selbst. Wenn das Objekt veränderbar (mutable) ist, kann der Inhalt innerhalb der Funktion geändert werden, und die Änderungen spiegeln sich in der äußeren Variable wider. Bei unveränderbaren Objekten (immutable), wie Zahlen oder Zeichenfolgen, erzeugt eine Änderung innerhalb der Funktion ein neues Objekt, ohne das ursprüngliche zu beeinträchtigen.
Beispiel für ein veränderbares Objekt:
def add_value(lst): lst.append(42) nums = [1, 2, 3] add_value(nums) print(nums) # [1, 2, 3, 42]
Für ein unveränderbares Objekt:
def add_value(num): num += 10 x = 5 add_value(x) print(x) # 5
Frage: "Werden in Python Variablen in Funktionen per Referenz oder per Wert übergeben?"
Antwort: Weder noch im klassischen Sinne. Die Variable übergibt einen Verweis auf das Objekt, nicht die Variable selbst, und man kann das Objekt für die äußere Variable nicht ersetzen.
Geschichte In einem der Projekte zur Datenverarbeitung wurde eine Funktion verwendet, um eine Liste zu filtern. Es wurde innerhalb der Funktion keine neue Liste erstellt; die Filterung erfolgte durch Änderungen an der ursprünglichen Liste. Dies führte dazu, dass die ursprünglichen Daten gelöscht wurden – nach mehreren Durchläufen des Skripts waren die Daten bereits verloren.
Geschichte Ein Junior-Entwickler dachte, dass Strings "per Referenz" innerhalb der Funktion geändert werden könnten, da andere Parameter (Listen) erfolgreich geändert werden konnten. Infolgedessen erhielt das Programm nach dem Aufruf der Funktion nicht die erwarteten Änderungen (der String änderte sich nicht), was zu unerklärlichen Bugs führte.
Geschichte In einer REST API zur Filterung von Eingabedaten vergaß der Entwickler, eine Kopie des Wörterbuchs der Parameter zu erstellen, und bei der Validierung gingen die Werte verloren – die Parameter wurden aus dem ursprünglichen Objekt entfernt, was die Logik nachfolgender Anfragen störte.