Veränderbar und Unveränderbar in Python
Dieser Artikel erklärt Veränderbarkeit und Unveränderbarkeit in Python.
YouTube Video
Veränderbar und Unveränderbar in Python
"Veränderbar" und "unveränderbar" beziehen sich auf die Veränderbarkeit eines Objekts. Das Verständnis dieses Konzepts hilft, unerwartete Fehler zu vermeiden und eine effiziente Speicherverwaltung zu gewährleisten.
Was bedeutet Veränderbar?
Veränderbare Objekte können ihren internen Zustand nach der Erstellung ändern.
Haupttypen veränderbarer Daten
list
dict
set
- Benutzerdefinierte Klassen (wenn ihre Attribute geändert werden können)
Beispiel: Bearbeiten einer Liste
1numbers = [1, 2, 3]
2numbers[0] = 100
3print(numbers) # [100, 2, 3]
Eine Liste ist ein veränderbares Objekt, und ihre Elemente können frei bearbeitet werden.
Was bedeutet Unveränderbar?
Unveränderbare Objekte können nach ihrer Erstellung nicht geändert werden. Ein Versuch, sie zu ändern, führt zur Erstellung eines neuen Objekts.
Haupttypen unveränderbarer Daten
int
float
str
tuple
bool
frozenset
Beispiel: Bearbeiten eines Strings
1text = "hello"
2# text[0] = "H" # TypeError: 'str' object does not support item assignment
3
4text = "H" + text[1:] # Creates a new string
5print(text) # "Hello"
Strings sind unveränderbar, daher können sie nicht teilweise geändert werden.
Vergleich von Veränderbar und Unveränderbar
1# Mutable example
2a = [1, 2, 3]
3b = a
4b[0] = 100
5print(a) # [100, 2, 3] -> a is also changed
6
7# Immutable example
8x = 10
9y = x
10y = 20
11print(x) # 10 -> x is unchanged
Wie Sie an diesem Beispiel sehen können, werden veränderbare Objekte durch Referenz gemeinsam genutzt, sodass sie andere Variablen beeinflussen können. Andererseits erstellen unveränderliche Objekte neue Instanzen bei einer Neuzuweisung, wobei der ursprüngliche Wert unberührt bleibt.
Untersuchung des internen Verhaltens mithilfe von id()
In Python können Sie die Funktion id()
verwenden, um die ID eines Objekts zu überprüfen. Die Objekt-ID ähnelt einer Speicheradresse.
1# Immutable int behavior
2a = 10
3print(id(a)) # e.g., 140715920176592
4a += 1
5print(id(a)) # e.g., 140715920176624 -> ID has changed
6
7# Mutable list behavior
8b = [1, 2, 3]
9print(id(b)) # e.g., 2819127951552
10b.append(4)
11print(id(b)) # Same ID -> only the content has changed
Wie gezeigt, wird für unveränderliche Typen ein neues Objekt erstellt, während veränderliche Typen an Ort und Stelle geändert werden.
Funktionen und Vorsicht bei veränderlichen und unveränderlichen Objekten
Beim Übergeben eines veränderlichen Objekts an eine Funktion können die ursprünglichen Daten verändert werden.
Beispiel: Eine Funktion, die eine Liste modifiziert
1def modify_list(lst):
2 lst.append(100)
3
4my_list = [1, 2, 3]
5modify_list(my_list)
6print(my_list) # [1, 2, 3, 100]
Beispiel: Eine Funktion, die eine Zahl verändert
Andererseits führt der Versuch, ein unveränderliches Objekt zu verändern, zur Erstellung eines neuen Objekts.
1def modify_number(n):
2 n += 10
3
4my_number = 5
5modify_number(my_number)
6print(my_number) # 5 -> unchanged
Praktische Überlegungen
Vermeiden Sie die Verwendung veränderlicher Objekte als Standardargumente
1# Bad example
2def add_item(item, container=[]):
3 container.append(item)
4 return container
5
6print(add_item(1)) # [1]
7print(add_item(2)) # [1, 2] -> unintended behavior
8
9# Good example
10def add_item(item, container=None):
11 if container is None:
12 container = []
13 container.append(item)
14 return container
15
16print(add_item(1)) # [1]
17print(add_item(2)) # [2]
Da Standardargumente nur einmal bei der Funktionsdefinition ausgewertet werden, kann die Verwendung veränderlicher Objekte zu unerwarteten Nebeneffekten führen.
- Im ersten Beispiel wird jedes Mal, wenn
add_item
aufgerufen wird, dasselbe Listenobjekt verwendet. Beim zweiten Aufruf vonadd_item(2)
befindet sich das zuvor hinzugefügte1
immer noch in der Liste, was zu[1, 2]
führt. - Im verbesserten Beispiel wird
None
als Standardwert verwendet, und innerhalb der Funktion wird eine neue Liste erstellt, wenn das ArgumentNone
ist. Dadurch wird sichergestellt, dass bei jedem Funktionsaufruf eine neue Liste erstellt wird, sodass vorherige Ergebnisse nachfolgende Aufrufe nicht beeinflussen.
Vermeiden Sie die Verwendung von veränderbaren Objekten wie Listen oder Dictionaries als Standardargumente; verwenden Sie stattdessen None
und initialisieren Sie sie innerhalb der Funktion. Dies ist eine grundlegende und wichtige Best Practice in Python.
Zusammenfassung
Um Variablen und Datentypen in Python tiefgehend zu verstehen, ist es entscheidend, die Unterschiede zwischen veränderlichen und unveränderlichen Objekten zu begreifen. Das Verständnis dieser Eigenschaften hilft Ihnen, unbeabsichtigtes Verhalten in Ihrem Code zu vermeiden und robustere sowie besser lesbare Programme zu schreiben.
Sie können den obigen Artikel mit Visual Studio Code auf unserem YouTube-Kanal verfolgen. Bitte schauen Sie sich auch den YouTube-Kanal an.