Seite 1 von 1

Unerklärliches Verhalten von Dictionaries in Listen

Verfasst: Montag 18. März 2013, 11:19
von Silmaril
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.

Re: Unerklärliches Verhalten von Dictionaries in Listen

Verfasst: Montag 18. März 2013, 11:28
von webspider

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.

Re: Unerklärliches Verhalten von Dictionaries in Listen

Verfasst: Montag 18. März 2013, 11:29
von kbr
Das Verhalten tritt dann auf, wenn Du mehrere Labels in einer Liste hast, die auf das selbe Dictionary verweisen.

Re: Unerklärliches Verhalten von Dictionaries in Listen

Verfasst: Montag 18. März 2013, 11:42
von Silmaril
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