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
Patricia ArquetteOriginal
2024-10-25 15:56:02340Durchsuche

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]}

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: []}

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)

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

>>> xs[0] is a and xs[1] is a
True

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))

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!

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