Heim >Backend-Entwicklung >Python-Tutorial >Warum verursacht Pythons „dict.fromkeys' mit veränderlichen Werten unerwartetes Verhalten?
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: []}
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
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!