Python: Anhängen eines Wörterbuchs an eine Liste - Ich sehe ein zeigerähnliches Verhalten

85

Im Python-Interpreter habe ich Folgendes versucht:

>>>
>>> a = []
>>> b = {1:'one'}
>>> a.append(b)
>>> a
[{1: 'one'}]
>>> b[1] = 'ONE'
>>> a
[{1: 'ONE'}]
>>>

Hier ändere ich nach dem Anhängen des Wörterbuchs 'b' an die Liste 'a' den Wert, der dem Schlüssel 1 im Wörterbuch 'a' entspricht. Irgendwie spiegelt sich diese Änderung auch in der Liste wider. Wenn ich ein Wörterbuch an eine Liste anhänge, füge ich dann nicht nur den Wert des Wörterbuchs hinzu? Es sieht so aus, als hätte ich einen Zeiger auf das Wörterbuch an die Liste angehängt, und daher werden die Änderungen am Wörterbuch auch in der Liste wiedergegeben.

Ich möchte nicht, dass die Änderung in der Liste angezeigt wird. Wie mache ich es?

Vielen Dank für Ihre Zeit!

neo29
quelle
Tschechow Es ist kein Wörterbuch 'b' , es ist entweder Wörterbuch b oder Wörterbuch des Namens 'b' . Übrigens haben Sie fälschlicherweise geschrieben: "Ich ändere den Wert, der dem Schlüssel 1 im Wörterbuch 'a' entspricht." Nein, im Wörterbuch b. In Bezug auf Ihr Erstaunen: Eine Liste enthält keine Werte, sondern Objekte, da in Python alles Objekte sind. Oder genauer gesagt, eine Liste enthält Verweise auf die Objekte.
Eyquem
Tschechow Sie sollten auch diese Frage sehen: ( stackoverflow.com/questions/5242933/… )
eyquem
@eyquem danke für deinen Kommentar. Ich habe das in Eile gepostet. Entschuldigen Sie.
Neo29
Tschechow Es war kein Vorwurf, es war nur Information. Übrigens, wenn meine Antwort etwas nützlich ist, kann sie positiv bewertet werden. Sie können auch eine Antwort unter den Antworten "akzeptieren", indem Sie auf den chevronförmigen Streifen unter dem Punktezähler links neben einer Antwort klicken. Dadurch erhalten Sie 25 Punkte. Oder Sie können sich dafür entscheiden, keine Frage anzunehmen.
Eyquem

Antworten:

140

Sie haben insofern Recht, als Ihre Liste einen Verweis auf das ursprüngliche Wörterbuch enthält.

a.append(b.copy()) sollte den Trick machen.

Denken Sie daran, dass dies eine flache Kopie macht. Eine Alternative ist die Verwendung copy.deepcopy(b), die eine tiefe Kopie erstellt.

NPE
quelle
6
genial! Ich war für eine lange Zeit auf diesem blockiert
Yasin
2
Das hat mich ungefähr eine halbe Stunde lang umgehauen, bis ich aufgab und mich entschied, den Stapel auszuchecken.
FlyingZebra1
35

Auch mit Diktat

a = []
b = {1:'one'}

a.append(dict(b))
print a
b[1]='iuqsdgf'
print a

Ergebnis

[{1: 'one'}]
[{1: 'one'}]
eyquem
quelle
Ich bin mir nicht sicher, ob es als copy () schnell genug ist, scheint aber schneller zu sein als deepcopy (). Vielleicht kommt es mit einem komplizierten Wörterbuchschema fast zu deepcopy (), weil dict () ein neues Wörterbuch erstellt.
Selotec