Heim >Backend-Entwicklung >Python-Tutorial >Warum zeigt die Python-Zuweisung unerwartetes Verhalten bei veränderlichen Objekten?

Warum zeigt die Python-Zuweisung unerwartetes Verhalten bei veränderlichen Objekten?

DDD
DDDOriginal
2024-12-07 20:25:16481Durchsuche

Why Does Python Assignment Show Unexpected Behavior with Mutable Objects?

Kopierverhalten bei der Python-Zuweisung

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:

  • dict.copy(): Erstellt eine flache Kopie, die die Elemente der obersten Ebene des Wörterbuchs kopiert.
  • copy.deepcopy(): Erstellt eine tiefe Kopie, die alle verschachtelten Objekte innerhalb der rekursiv kopiert Wörterbuch.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn