0%

Listen · Übung

Wenn zwei Namen eine Liste teilen

Eine Liste kann direkt verändert werden. Das führt zu einer Überraschung, wenn du dieselbe Liste einem zweiten Namen zuweist: Eine Zuweisung erstellt nicht automatisch eine Momentaufnahme.

Try it

Beide Namen zeigen das neue Element. Die Zuweisung shared_plan = weekend hat die Liste nicht kopiert. Sie hat einer Liste einen zweiten Namen gegeben.

Nachdem die Überraschung sichtbar ist, können wir die Lösung bewusst wählen.

Erstelle eine separate Liste, wenn Änderungen getrennt bleiben sollen

Rufe .copy() auf, wenn du eine unabhängige äußere Liste brauchst:

Try it

Jetzt beginnen die Listen mit gleichen Elementen, können sich aber unabhängig ändern. .copy() hat einen klaren Zweck, weil wir das Problem gesehen haben, das es löst.

Eine Zuweisung lässt weekend und shared_plan auf dieselbe geänderte Liste verweisen. copy() gibt separate_plan dagegen eine unabhängige Liste.

Die Übung am Ende dieser Lektion erstellt beide Beziehungen in einem Programm. Nach append() hat sich das eine gemeinsame Objekt verändert. Deshalb ist die Änderung über beide Namen sichtbar, während die separate Kopie unverändert bleibt. Im Diagramm bedeutet ASSIGNMENT „Zuweisung“, COPY „Kopie“ und LIST OBJECT „Listenobjekt“. TWO NAMES, ONE LIST bedeutet „zwei Namen, eine Liste“, TWO NAMES, TWO LISTS „zwei Namen, zwei Listen“.

Diese Unterscheidung erklärt ein Verhalten, das sonst überraschend wirken kann:

Try it

Eine Änderung über alias verändert original, weil beide Namen auf dieselbe Liste verweisen. Die kopierte Liste behält 10 als erstes Element.

Was gibt dieser Code aus?

colors = ["red", "blue"]
other = colors
saved = colors.copy()
other.append("green")
print(colors)
print(saved)

Bei den Listen mit Strings und Zahlen hier hilft die Frage: „Sollen diese beiden Namen dieselben zukünftigen Änderungen sehen?“ Wenn ja, kann eine Zuweisung richtig sein. Wenn nein, erstelle eine Kopie.

Das Wort äußere ist wichtig: .copy() erstellt eine neue Liste, kopiert aber nicht zusätzlich die darin gespeicherten Objekte. Ist ein Element selbst eine veränderbare Liste, verweisen beide äußeren Listen weiterhin auf dasselbe innere Element. Das heißt flache Kopie. Die Strings und Zahlen in unseren Beispielen können nicht direkt verändert werden. Deshalb lässt das Ersetzen eines Elements in einer äußeren Liste die andere Liste unberührt.

Aufgabe

Vervollständige das Programm, sodass es beide Arten von Beziehung erstellt:

  • Mach shared_plan zu einem weiteren Namen für die vorhandene Liste weekend.

  • Mach separate_plan zu einer separaten Kopie.

  • Behalte die vorgegebene append-Operation bei.

  • Ersetze das erste Element in separate_plan durch "cycle".

  • Gib alle drei Listen aus.

Das angehängte Element soll über weekend und shared_plan erscheinen, aber nicht in separate_plan.

Wenn das Programm läuft, klicke in der Werkzeugleiste des Editors auf Step und gehe mit Next hindurch. Beobachte dabei den Variablenbereich. Wenn weekend.append("cook") läuft, ändern sich weekend und shared_plan gemeinsam, denn sie sind zwei Namen für eine Liste. separate_plan bleibt unverändert. Darin steckt die gesamte Idee dieser Lektion, in einem Moment sichtbar.