Heim > Backend-Entwicklung > Python-Tutorial > Warum erstellt „dict.fromkeys' mit veränderlichen Werten gemeinsame Objekte?

Warum erstellt „dict.fromkeys' mit veränderlichen Werten gemeinsame Objekte?

Susan Sarandon
Freigeben: 2024-10-26 03:16:27
Original
270 Leute haben es durchsucht

Why Does `dict.fromkeys` With Mutable Values Create Shared Objects?

Veränderliche Objekte und Wörterbucherstellung mit fromkeys

Das beobachtete Verhalten bei der Verwendung von dict.fromkeys zum Erstellen von Wörterbüchern mit veränderlichen Objekten, wie z. B. Listen, kann zunächst überraschen. Das folgende Beispiel veranschaulicht das Problem:

<code class="python">xs = dict.fromkeys(range(2), [])
xs[0].append(1)
print(xs)  # Outputs: {0: [1], 1: [1]}</code>
Nach dem Login kopieren

In diesem Fall erstellen wir ein Wörterbuch mit zwei Schlüsseln (0 und 1) und einer leeren Liste für jeden Wert. Wenn wir jedoch ein Element an die Liste anhängen, die dem Schlüssel 0 zugeordnet ist, erscheint es auch in der Liste, die dem Schlüssel 1 zugeordnet ist.

Um dieses Verhalten zu verstehen, ist es wichtig zu beachten, dass dict.fromkeys dasselbe Wertobjekt verwendet zwischen allen Tasten. In unserem Beispiel verweisen sowohl xs[0] als auch xs[1] auf dasselbe Listenobjekt, wie unten gezeigt:

<code class="python">print(xs[0] is xs[1])  # Outputs: True</code>
Nach dem Login kopieren

Daher werden alle Änderungen, die über xs[0] an der Liste vorgenommen werden, ebenfalls berücksichtigt in xs[1], weil sie auf dasselbe zugrunde liegende Objekt verweisen.

Im Gegensatz dazu führt die Verwendung eines Wörterbuchverständnisses zum Erstellen eines Wörterbuchs mit veränderlichen Objekten dazu, dass jeder Wert ein separates Objekt ist:

<code class="python">xs = {i: [] for i in range(2)}
xs[0].append(1)
print(xs)  # Outputs: {0: [1], 1: []}</code>
Nach dem Login kopieren

In diesem Fall sind xs[0] und xs[1] nicht dasselbe Objekt, sodass sich das Ändern von xs[0] nicht auf xs[1] auswirkt.

In Python 2.6 oder früher, wenn Wörterbuchverständnisse nicht verfügbar sind, können Sie einen Generatorausdruck mit dict() verwenden, um das gleiche Verhalten wie ein Wörterbuchverständnis zu erreichen:

<code class="python">xs = dict((i, []) for i in range(2))</code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum erstellt „dict.fromkeys' mit veränderlichen Werten gemeinsame Objekte?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage