Heim >Backend-Entwicklung >Python-Tutorial >Warum zeigt die Python-Zuweisung unerwartetes Verhalten bei veränderlichen Objekten?
Einführung
Python, eine beliebte Programmiersprache, zeigt ein eigenartiges Verhalten, wenn Zuweisen von Objekten zu Variablen über den Zuweisungsoperator (=). Dieses Verhalten, das allgemein als „Copy-Through“ bezeichnet wird, führt häufig zu unerwarteten Ergebnissen. Um dieses Konzept zu entschlüsseln, untersuchen wir ein häufiges Beispiel.
Das Problem: Durchkopieren vs. Kopieren
Betrachten Sie den folgenden Code:
dict_a = dict_b = dict_c = {} dict_c['hello'] = 'goodbye' print(dict_a) print(dict_b) print(dict_c)
Man würde erwarten, dass dieser Code drei separate Wörterbücher erstellt, sie leer initialisiert und dann nur dict_c ändert. Die erwartete Ausgabe sollte wie folgt aussehen:
{} {} {'hello': 'goodbye'}
Das Durchkopierverhalten von Python führt jedoch zu einem anderen Ergebnis:
{'hello': 'goodbye'} {'hello': 'goodbye'} {'hello': 'goodbye'}
Erklärung: Referenzzuweisung
Der Schlüssel zum Verständnis dieses Verhaltens liegt in der Natur der Variablen in Python. In Python sind Variablen (oder Namen) lediglich Zeiger auf die tatsächlich im Speicher gespeicherten Objekte. Wenn Sie eine Variable einer anderen zuweisen, kopiert der Zuweisungsoperator (=) die Speicheradresse (oder den Zeiger) von einer Variablen in eine andere. In unserem Beispiel:
dict_a = dict_b = dict_c
Dies bedeutet, dass dict_a, dict_b und dict_c alle auf dasselbe Wörterbuchobjekt im Speicher verweisen. Wenn dict_c geändert wird, erfahren daher alle drei Variablen die gleiche Änderung, was zum Durchkopiereffekt führt.
Problemlösung: Kopiermethoden verwenden
Zur Vermeidung Beim Durchkopierverhalten muss explizit eine Kopie des zugrunde liegenden Objekts erstellt werden. Python bietet zu diesem Zweck zwei Methoden:
Beispiel:
dict_a = dict_b.copy() dict_c = copy.deepcopy(dict_a) dict_c['hello'] = 'goodbye' print(dict_a) # {'hello': 'goodbye'} (shallow copy, affected) print(dict_b) # {} (unaffected) print(dict_c) # {'hello': 'goodbye'} (deep copy, unaffected)
Durch die Verwendung dieser Kopiermethoden können wir unabhängige Kopien von Objekten erstellen und das Durchkopierverhalten vermeiden.
Das obige ist der detaillierte Inhalt vonWarum zeigt die Python-Zuweisung unerwartetes Verhalten bei veränderlichen Objekten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!