Wörterbucherstellung und veränderbare 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:
xs = dict.fromkeys(range(2), [])
xs[0].append(1)
print(xs)
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 geschieht, weil fromkeys bindet Jeder Schlüssel verweist auf dieselbe Referenz des veränderlichen Objekts, was zu gemeinsamen Änderungen führt.
Im Gegensatz dazu weist das Wörterbuchverständnis in Python 3.2 unterschiedliche Werte auf Verhalten:
xs = {i: [] for i in range(2)}
xs[0].append(1)
print(xs)
Hier ist jeder Schlüssel an ein bestimmtes 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:
a = []
xs = dict.fromkeys(range(2), a)
Jeder Schlüssel im resultierenden Wörterbuch verweist auf dasselbe Objekt, was zu den beobachteten gemeinsamen Änderungen führt.
Um das gewünschte Verhalten von zu erreichen Wenn Sie für jeden Schlüssel unterschiedliche veränderbare Objekte verwenden möchten, verwenden Sie Wörterbuchverständnisse oder verwenden Sie für Python 2.6 und frühere Versionen ohne Wörterbuchverständnisse dict() mit einem Generator Ausdruck:
xs = dict((i, []) for i in range(2))
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3