Lösungen

Aufgabe: Mutation von Arrays beschreiben

Das gezeigte Programm ordnet das Array 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 arrays gespeicherten Arrays von Arrays das selbe (hier mutierte) Objekt, das nämlich zu diesem Zeitpunkt auch (wieder) in der Variablen nums gespeichert ist.

Aufgabe: Mutation von Arrays programmieren

Die Prozedur replace ersetzt Teile eines Arrays 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 des eingesetzten Arrays erhöht wird und jedesmal neu getestet wird, ob sie noch ein gültiger Index im durchsuchten Array ist, das ja seine Länge ändert. Außerdem ist es nicht sinnvoll, Teilarrays 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.

b: ----> Array
         [  ,  ,  ]
          |  |  |
          v  v  v
a: ------> Array
           [1,1,1]

Das in der Variablen a gespeicherte Array [1,2,3] wird zunächst drei mal als Element in einem weiteren Array 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 Array-Objekt. Das erste Element dieses Arrays zeigt auf das selbe Array-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 Array-Mutation. Anschließend zeigt das erste Element des in a gespeicherten Arrays auf dieses Array selbst. Dadurch wird eine zyklische Struktur erzeugt. Zeile 3 ist eine Ausgabe-Anweisung, die das zweite Element 42 des in a gespeicherten Arrays ausgibt.