Heim >Backend-Entwicklung >Python-Tutorial >Warum erstellt „dict.fromkeys' mit veränderlichen Werten gemeinsame Objekte?
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!