Lösungen

Aufgabe: Mutation von Listen beschreiben

Das gezeigte Programm ordnet die Liste a so um, dass es in zwei Teile aufgeteilt ist: der erste Teil enthält alle Zahlen aus a, die kleiner sind als das (ursprünglich) erste Element; der zweite Teil enthält die restlichen Zahlen. Das ursprünglich erste Element trennt dabei nach Ablauf des Programms die beiden Teile. Es steht an Position m.

Hausaufgabe: Objekte und Referenzen visualisieren

Das erste Programm erzeugt die folgende Ausgabe:

[3,2,1]
[3,2,1]
True
True
[1,2,3]
[1,2,3]
True
False

Im ersten Aufruf von test referenzieren sowohl a als auch b das selbe Objekt, das x referenziert. Die Veränderung des Objektes in a wirkt sich also auch auf das (selbe) Objekt in b aus und die Vergleiche sind beide wahr.

Vor dem zweiten Aufruf hat das Objekt in x den Wert [3,2,1], b zeigt auf ein anderes Objekt. Nachdem das Objekt in a verändert wurde, haben beide Objekte den selben Wert aber eine unterschiedliche Identität.

Das zweite Programm gibt die Zahl 7 aus. Sobald die Mutationsanweisung in der sechsten Programmzeile ausgeführt wird, sind beide Elemente des in der Variablen lists gespeicherten Listen von Listen dasselbe (hier mutierte) Objekt, das nämlich zu diesem Zeitpunkt auch (wieder) in der Variablen nums gespeichert ist.

Aufgabe: Mutation von Listen programmieren

Die Prozedur replace ersetzt Teile einer Liste durch andere Teile.

def replace(a,b,c):
  n = len(b)
  if n > 0:
    i = 0
    while i <= len(a)-n:
      if a[i:i+n] == b:
        a[i:i+n] = c
        i = i + len(c)
      else:
        i = i + 1

Wichtig ist hierbei, dass die Zählvariable i um die Länge der eingesetzten Liste erhöht wird und jedesmal neu getestet wird, ob sie noch ein gültiger Index in der durchsuchten Liste ist, das ja seine Länge ändert. Außerdem ist es nicht sinnvoll, Teillisten der Länge Null zu ersetzen. Hier ist ein Programm, das die definierte Prozedur testet.

nums = [1,2,3,4,1,2,1,2,3,4]
replace(nums,[1,2,3],[123])
print(nums)

Aufgabe: Geteilte Objekte dokumentieren

Bei Programmende sieht die Objektstruktur wie folgt aus. shared_objects

Die in der Variablen a gespeicherte Liste [1,2,3] wird zunächst dreimal als Element in einer weiteren Liste b gespeichert. Da alle drei Elemente von b auf das selbe Objekt verweisen, werden durch die in der ersten Zählschleife ausgeführte Mutation alle Elemente von a auf 1 gesetzt. Die zweite Zählschleife berechnet deshalb die Summe aus neun Einsen, so dass am Ende 9 ausgegeben wird.

Aufgabe: Zyklische Strukturen dokumentieren

Das Programm gibt 42 aus.

Die Variable a zeigt nach Ablauf des Programms auf ein List-Objekt. Das erste Element dieser Liste zeigt auf das selbe List-Objekt, das zweite Element zeigt auf die Zahl 42 (siehe Teil b).

Zeile 1 enthält eine Zuweisung. Anschließend hat die Variable a den Wert [42,42]. Zeile 2 enthält eine Listen-Mutation. Anschließend zeigt das erste Element der in a gespeicherten Liste auf diese Liste selbst. Dadurch wird eine zyklische Struktur erzeugt. Zeile 3 ist eine Ausgabe-Anweisung, die das zweite Element 42 der in a gespeicherten Liste ausgibt.