Heim > Backend-Entwicklung > Python-Tutorial > Warum verursacht Pythons „dict.fromkeys' mit veränderlichen Werten unerwartetes Verhalten?

Warum verursacht Pythons „dict.fromkeys' mit veränderlichen Werten unerwartetes Verhalten?

Patricia Arquette
Freigeben: 2024-10-25 15:56:02
Original
345 Leute haben es durchsucht

Why Does Python's `dict.fromkeys` With Mutable Values Cause Unexpected Behavior?

Wörterbucherstellung mit fromkeys und veränderlichen Objekten: Eine unerwartete Überraschung

In Python 2.6 und 3.2 kann das Verhalten von dict.fromkeys mit veränderlichen Objekten überraschend sein. Wenn eine Liste als Wert verwendet wird, wirkt sich die Änderung eines Eintrags im Wörterbuch auf jeden anderen Eintrag aus, wie unten gezeigt:

>>> xs = dict.fromkeys(range(2), [])
>>> xs
{0: [], 1: []}
>>> xs[0].append(1)
>>> xs
{0: [1], 1: [1]}
Nach dem Login kopieren

Dieses Verhalten tritt jedoch bei den Diktatverständnissen von Python 3.2 nicht auf:

>>> xs = {i:[] for i in range(2)}
>>> xs
{0: [], 1: []}
>>> xs[0].append(1)
>>> xs
{0: [1], 1: []}
Nach dem Login kopieren

Grund für das Verhalten von fromkeys

Der offensichtliche Grund für das Verhalten von fromkeys ist, dass jeder Eintrag im resultierenden Wörterbuch auf dasselbe Objekt verweist. Die Änderung des Objekts über einen Eintrag wirkt sich auf alle anderen aus. Dies kann durch manuelles Erstellen des Wörterbuchs geklärt werden:

>>> a = []
>>> xs = dict.fromkeys(range(2), a)
Nach dem Login kopieren

Dies zeigt, dass alle Wörterbucheinträge auf dasselbe Objekt verweisen:

>>> xs[0] is a and xs[1] is a
True
Nach dem Login kopieren

Abschwächung des Verhaltens durch Dict Comprehensions

Um dieses Verhalten zu vermeiden, verwenden Sie dict comprehensions oder, wenn Sie Python 2.6 oder früher verwenden, dict mit einem Generatorausdruck:

xs = dict((i, []) for i in range(2))
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWarum verursacht Pythons „dict.fromkeys' mit veränderlichen Werten unerwartetes Verhalten?. 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