Wörterbucherstellung und veränderliche Objekte: Überraschendes Verhalten mit fromkeys
Beim Erstellen von Wörterbüchern mit dict.fromkeys() in Python kann es zu einer unerwarteten Situation kommen entstehen, wenn veränderliche Objekte als Werte verwendet werden. Betrachten Sie das folgende Beispiel:
<code class="python">xs = dict.fromkeys(range(2), []) xs[0].append(1) print(xs)</code>
Obwohl zwei separate Listenobjekte als Werte für die Wörterbuchschlüssel 0 und 1 erstellt werden, wird durch das Hinzufügen eines Elements zur Liste am Index 0 dieses auch zur Liste am Index 1 hinzugefügt. Dies tritt auf, weil fromkeys jeden Schlüssel an die gleiche Referenz des veränderlichen Objekts bindet, was zu gemeinsamen Änderungen führt.
Im Gegensatz dazu weisen Wörterbuchverständnisse in Python 3.2 ein unterschiedliches Verhalten auf:
<code class="python">xs = {i: [] for i in range(2)} xs[0].append(1) print(xs)</code>
Hier jeweils Der Schlüssel ist an ein eindeutiges Listenobjekt gebunden. Das Anhängen eines Elements an die Liste bei Index 0 hat keine Auswirkungen auf die Liste bei Index 1.
Warum der Unterschied?
Das Verhalten von fromkeys kann durch Betrachtung der verstanden werden Folgender äquivalenter Code:
<code class="python">a = [] xs = dict.fromkeys(range(2), a)</code>
Jeder Schlüssel im resultierenden Wörterbuch verweist auf dasselbe Objekt, was zu den beobachteten gemeinsamen Änderungen führt.
Um das gewünschte Verhalten unterschiedlicher veränderlicher Objekte für jeden Schlüssel zu erreichen , verwenden Sie Wörterbuchverständnisse oder verwenden Sie für Python 2.6 und früher ohne Wörterbuchverständnisse dict() mit einem Generatorausdruck:
<code class="python">xs = dict((i, []) for i in range(2))</code>
Das obige ist der detaillierte Inhalt vonWarum erstellt „dict.fromkeys()' gemeinsam genutzte veränderbare Objekte in Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!