Veränderliche Funktionsargumente

Python bietet eine Vielzahl von Datentypen, von denen einige nach ihrer Erstellung verändert werden können und andere nicht. Wenn wir von Typen sprechen, die verändert werden können, nennen wir sie "veränderliche" Typen. Im Gegensatz dazu werden Typen, die nicht verändert werden können, "unveränderliche" Typen genannt.

Veränderliche Typen

Die gebräuchlichsten veränderlichen Typen sind list, dict und set. Hier ist ein Beispiel für eine Liste:
fruits = ['apple', 'banana', 'cherry']
print(fruits, type(fruits))  # ['apple', 'banana', 'cherry'] <class 'list'>
Mit einer list können Sie ihre Elemente ändern, neue hinzufügen oder bestehende entfernen:
fruits[1] = 'blueberry'       # Ersetze 'banana' durch 'blueberry'
fruits.append('dragonfruit')  # Füge 'dragonfruit' am Ende der Liste hinzu
print(fruits)                 # ['apple', 'blueberry', 'cherry', 'dragonfruit']

Unveränderliche Typen

Beispiele für unveränderliche Typen sind int, float, string und tuple. Einmal erstellt, können Sie deren Inhalt nicht mehr ändern. Hier ist ein Beispiel für einen string:
message = 'hello'
print(message, type(message))  # hello <class 'str'>
Wenn Sie versuchen, einen Teil des string zu ändern, lässt Python das nicht zu:
message[0] = 'H'  # Der Versuch, 'h' in 'H' zu ändern, führt zu einem TypeError
Wie kommt es, dass int unveränderlich ist? Können wir den Wert nicht mit += oder -= ändern?
Wenn wir in Python von Mutabilität sprechen, meinen wir, dass der tatsächliche im Speicher gespeicherte Wert verändert werden kann. Wenn wir zum Beispiel eine Liste haben, können wir ein Element in der Liste ändern, und es ist immer noch dieselbe Liste im Speicher.
Ganzzahlen (Integers) in Python sind unveränderlich. Das bedeutet, dass der Wert im Speicher nicht geändert werden kann. Wenn wir eine Ganzzahl a = 5 haben und eine Operation wie a += 2 durchführen, sieht es so aus, als hätten wir a geändert. Tatsächlich hat Python jedoch ein neues Objekt im Speicher mit dem Wert 7 erstellt und a so aktualisiert, dass es auf dieses neue Objekt verweist. Die ursprüngliche 5 wurde im Speicher nicht verändert – deshalb gelten int als unveränderlich.
a = 5
print(id(a))  # Gibt die Speicheradresse von a aus, nehmen wir an, es ist 1001

a += 2
print(a)      # Gibt 7 aus
print(id(a))  # Gibt eine andere Speicheradresse aus, sagen wir 1002
Die Funktion id in Python gibt die Identität eines Objekts zurück, die für dieses Objekt während seiner Lebensdauer eindeutig und konstant ist. Wenn wir also sehen, dass sich die Identität von a nach der Operation a += 2 geändert hat, ist das ein deutliches Zeichen dafür, dass a nun auf ein neues Objekt im Speicher zeigt. Die ursprüngliche Ganzzahl 5 wurde nicht geändert, was bestätigt, dass Ganzzahlen in Python tatsächlich unveränderlich sind.

Veränderliche Argumente in Funktionen

Wenn wir ein veränderliches Objekt (wie eine Liste) in eine Funktion übergeben, gibt Python der Funktion eine Referenz auf dieses Objekt. Das bedeutet, dass wenn die Funktion das veränderliche Objekt modifiziert, diese Änderung auch außerhalb der Funktion sichtbar ist.
Lassen Sie uns eine Funktion verwenden, die eine Liste empfängt und ein Element zu ihr hinzufügt:
def add_item(my_list):
    my_list.append('added item')  # Fügt der Liste ein neues Element hinzu

shopping_list = ['apples', 'bananas', 'cherries']
print(shopping_list)  # Prints: ['apples', 'bananas', 'cherries']

# Nun benutzen wir die Funktion, um unserer Einkaufsliste ein Element hinzuzufügen
add_item(shopping_list)
print(shopping_list)  # Prints: ['apples', 'bananas', 'cherries', 'added item']
Wie Sie sehen, besitzt shopping_list nach dem Aufruf der Funktion add_item ein neues Element. Dies geschah, obwohl wir shopping_list außerhalb der Funktion nicht direkt modifiziert haben.
Es ist jedoch wichtig zu verstehen, dass wenn Sie innerhalb der Funktion dem gesamten veränderlichen Objekt einen neuen Wert zuweisen, dies das ursprüngliche Objekt nicht beeinflusst. Dies liegt daran, dass Sie der lokalen Variable der Funktion eine neue Referenz zuweisen und nicht das Originalobjekt verändern. Schauen wir uns dazu ein Beispiel an:
def change_list(my_list):
    my_list = ['entirely', 'new', 'list']  # Dies beeinflusst nicht die ursprüngliche Liste

shopping_list = ['apples', 'bananas', 'cherries']
change_list(shopping_list)
print(shopping_list)  # Still prints: ['apples', 'bananas', 'cherries']
Obwohl wir die Funktion change_list mit shopping_list als Argument aufgerufen haben, hat sich der Inhalt von shopping_list nicht verändert. Das liegt daran, dass innerhalb der Funktion my_list eine neue Referenz (auf eine völlig neue Liste) zugewiesen wurde, während die Referenz von shopping_list unberührt blieb.
Die Hauptaussage hier ist: Wenn Sie ein veränderliches Objekt an eine Funktion in Python übergeben, denken Sie daran, dass wenn die Funktion das Objekt ändert (z.B. ein Element zu einer Liste hinzufügt), diese Änderung dauerhaft ist und außerhalb der Funktion sichtbar wird. Wenn Sie jedoch innerhalb der Funktion dem gesamten Objekt einen neuen Wert zuweisen, hat dies keine Auswirkungen auf das Originalobjekt.
 
To check your solution you need to sign in
Sign in to continue