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
Susan SarandonOriginal
2024-10-26 03:16:27283Durchsuche

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>

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>

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>

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>

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!

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