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!


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.


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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.