Hallo,
bei der Erstellung einer wx.listCtrl zum update eines dictionaries welches auf Knopfdruck wieder in seinen Initalzustand zurückgesetzt werden soll bin ich auf folgendes (für mich unverständliches) Verhalten gestossen:
dict0 = {'a': 1, 'b': 2}
dict1 = dict0
dict1.update({'b': 3})
print (dict1)
print (dict0)
{'a': 1, 'b': 3}
{'a': 1, 'b': 3}
Weshalb sind nach dem update eines dictionaries beide geändert ?
win10, Anaconda3, Spyder (python 3.8)
Lubuntu, Spyder (python 3.8)
dictionary1 = dictionary0, update dictionary1, dictionary0 == dictionary1 ?
Du hast nur ein Wörterbuch, das an zwei unterschiedliche Namen gebunden wurde.
Wenn Du eine Kopie willst, mußt Du das Wörterbuch kopieren. Zum setzen eines Wertes nimmt man nicht update!
Wenn Du eine Kopie willst, mußt Du das Wörterbuch kopieren. Zum setzen eines Wertes nimmt man nicht update!
Code: Alles auswählen
initial_dictionary = {"a": 1, "b": 2}
working_dictionary = initial_dictionary.copy()
...
working_dictionary["b"] = 3
Da Python mit Referenzen arbeitet, musst Du weiter beachten, ob die Inhalte in Deinen Dictionary mutable oder immutable sind. Für letzteres reicht das von Sirius3 genannte .copy, sonst brauchst Du ggf. das von __deets__ genannte copy.deepcopy.
- DeaD_EyE
- User
- Beiträge: 1017
- Registriert: Sonntag 19. September 2010, 13:45
- Wohnort: Hagen
- Kontaktdaten:
Code: Alles auswählen
d0 = {'a': 1, 'b': 2}
d1 = d0
print(id(d0))
print(id(d1))
print(d0 is d1)
# 2441305636992
# 2441305636992
# True
# Bei dir kommt eine andere id
# aber d0 und d1 sind ein und das selbe Objekt
Wenn d1 von d0 eine Kopie sein soll:
Code: Alles auswählen
d0 = {'a': 1, 'b': 2}
d1 = d0.copy()
Code: Alles auswählen
seq = [1, 2, 3]
d0 = {"a": seq}
d1 = d0.copy()
seq[0] = 42
print(seq)
print(d1)
Ist auch ein gelöstes Problem:[42, 2, 3]
{'a': [42, 2, 3]}
Code: Alles auswählen
import copy
seq = [1, 2, 3]
d0 = {"a": seq}
d1 = copy.deepcopy(d0)
seq[0] = 42
print(seq)
print(d1)
Die Liste ist mittels copy.deepcopy auch kopiert worden. copy.copy macht nur flache Kopien.[42, 2, 3]
{'a': [1, 2, 3]}
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server