Dictionaries und shallow copies in Python

Wenn man mit dictonaries in python arbeitet sollte man das Konzept der shallow copy kennen, da dieses Feature zu fiesen und vielleicht schwer zu findenden bugs führen kann. Mit der Funktion copy() kann man von einem Dictionary eine Kopie, aber eben “nur” eine shallow copy erzeugen.

Bei einer shallow copy handelt es sich zwar um zwei separate Objekte, aber die einzelnen Elemente der beiden Dictionaries verweisen auf dieselbe Speicherstelle. Diesen Umstand stellt folgender Beispielcode dar:

# Dictionaries definieren:
my_dict: dict[int, list[str]] = {0: ["a", "b"], 1: ["c", "d"]}
dict_copy: dict[int, list[str]] = my_dict.copy()

# ids der Dictionaries ausgeben:
print(id(my_dict))
print(id(dict_copy))

# Inhalte der beiden Dictionaries ausgeben
print(my_dict)
print(dict_copy)

Ausgabe:

2513461433280
2513483301312
{0: ['a', 'b'], 1: ['c', 'd']}
{0: ['a', 'b'], 1: ['c', 'd']}

Wir sehen anhand der unterschiedlichen IDs der Objekte, dass es sich in der Tat um zwei unterschiedliche Objekte handelt, die aber den gleichen Inhalt haben.

# Bei der Kopie des Dictionaries das erste Item des ersten Dictionary-Eintrags verändern
dict_copy[0][0] = "test"

# Erneut die Inhalte der beiden Dictionaries ausgeben:
print(my_dict)
print(dict_copy)

Ausgabe:

{0: ['test', 'b'], 1: ['c', 'd']}
{0: ['test', 'b'], 1: ['c', 'd']}

Wie wir sehen, wurde nicht nur die Kopie des Dictionaries (dict_copy) verändert, sondern auch das ursprüngliche Dictionary. Dies verdeutlicht, dass die Items im Objekt Verweise auf dieselbe Stelle im Speicher sind. Es ist also Vorsicht geboten, wenn man mit copy() arbeitet und dann einzelne Items der Dictionaries manipuliert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert