Fromkeys-Vorbehalte: Das Verhalten der Wörterbuchinitialisierung verstehen
In Python wird die Methode dict.fromkeys() häufig zum Erstellen eines Wörterbuchs verwendet mit angegebenen Schlüsseln, die leeren Listen zugewiesen sind. Eine Fehlinterpretation seines Verhaltens hat jedoch zu unerwarteten Ergebnissen geführt.
Warum fromkeys() schwierig ist
Wenn eine leere Liste [] als zweites Argument zum Diktieren bereitgestellt wird .fromkeys() verweisen alle Werte im resultierenden Wörterbuch auf das gleiche Listenobjekt. Dies bedeutet, dass sich jede Änderung an einem Wert auf alle Werte auswirkt.
Alternative Lösungen
Um dieses Problem zu beheben, werden die folgenden Lösungen empfohlen:
Verwenden Sie ein Wörterbuchverständnis:
In Python 2.7 oder höher ist ein Wörterbuchverständnis die prägnanteste und lesbarste Lösung:
data = {k: [] for k in range(2)}
Verwenden Sie ein Listenverständnis mit dict():
In früheren Python-Versionen kann ein Listenverständnis an dict() übergeben werden Konstruktor:
data = dict([(k, []) for k in range(2)])
Verwenden Sie einen Generatorausdruck mit dict():
In Python 2.4-2.6 kann ein Generatorausdruck verwendet werden mit dict() und Klammern können sein weggelassen:
data = dict((k, []) for k in range(2))
Beispiel
Das folgende Beispiel veranschaulicht den Unterschied zwischen dem Standardverhalten von fromkeys() und den empfohlenen Lösungen:
# Default behavior of fromkeys() data = {} data = data.fromkeys(range(2), []) data[1].append('hello') print(data) # Output: {0: ['hello'], 1: ['hello']} # Using a dictionary comprehension data = {k: [] for k in range(2)} data[1].append('hello') print(data) # Output: {0: [], 1: ['hello']}
Durch das Verständnis der Nuancen von fromkeys() können Entwickler effektiv Wörterbücher mit leeren Listen erstellen und einzelne Schlüssel verwalten Adressierung.
Das obige ist der detaillierte Inhalt vonWarum erstellt „dict.fromkeys()' freigegebene Listen und wie kann ich das vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!