Unerklärliches Verhalten von Dictionaries in Listen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Silmaril
User
Beiträge: 55
Registriert: Sonntag 21. September 2008, 17:10
Wohnort: Franken

Hallo Leute

Ich bin auch ein Problem gestoßen, dass ich alleine nicht mehr lösen kann. Eine Google-Suche ergab, dass eigentlich alles wie gedacht funktionieren müsste. Tut es aber nicht...

Also, ich habe Dictionaries wie z.B.

Code: Alles auswählen

d = {'a':1, 'b':2, 'c':3}
Außerdem habe ich eine Liste, die diese Dictionaries enthält:

Code: Alles auswählen

l=[{'a': 1, 'c': 3, 'b': 2}, {'a': 1, 'c': 3, 'b': 2}]
Wenn ich jetzt aber ein Wert eines Dictionary ändere, dann ändert sich der Wert in allen Dictionaries in der Liste, die ansonsten den gleichen Wert haben

Code: Alles auswählen

l[0]['c'] = 3333
[{'a': 1, 'c': 3333, 'b': 2}, {'a': 1, 'c': 3333, 'b': 2}]
Wäre in der Liste noch ein Dictionary mit anderen Werten für a, b und c, würde es in Ruhe gelassen werden

Zu allem Überfluss lässt sich das Problem auch nicht immer reproduzieren. In meinen Versuchen für diesen Post hatte ich das Problem einmal und einmal wieder nicht.

Ich bin ratlos.
Lebe jeden Tag, als wäre es Absicht.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Code: Alles auswählen

>>> d = {'a': 1, 'b': 2, 'c': 3}
>>> l = [d, d]
>>> l
[{'a': 1, 'b': 2, 'c': 3}, {'a': 1, 'b': 2, 'c': 3}]
>>> l[0]['a'] = 9000
>>> l
[{'a': 9000, 'b': 2, 'c': 3}, {'a': 9000, 'b': 2, 'c': 3}]
>>> m = [{'a': 1, 'b': 2, 'c': 3}, {'a': 1, 'b': 2, 'c': 3}]
>>> m[0]['a'] = 9000
>>> m
[{'a': 9000, 'b': 2, 'c': 3}, {'a': 1, 'b': 2, 'c': 3}]
Vergiss nicht, dass Python Namen verwendet. Das bedeutet, dass wenn man Listen durch Duplizierung von anderen Namen erhält, lediglich Zeiger kopiert werden und jegliche Änderungen sich in den Duplikaten spiegeln.
Zuletzt geändert von webspider am Montag 18. März 2013, 11:30, insgesamt 1-mal geändert.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Das Verhalten tritt dann auf, wenn Du mehrere Labels in einer Liste hast, die auf das selbe Dictionary verweisen.
Silmaril
User
Beiträge: 55
Registriert: Sonntag 21. September 2008, 17:10
Wohnort: Franken

Ja stimmt. Das ist also doch die Lösung.

Das "lustige" ist, dass ich das gestern schon durch nachdenken ausgeschlossen habe, weil ich annahm, ich habe jetzt kein Zeiger sondern ein neues Objekt verändert habe. Tja, da hab ich mal so richtig falsch gedacht.

Danke, Leute
Lebe jeden Tag, als wäre es Absicht.
Antworten