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
.
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.
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)
Bei Programmende sieht die Objektstruktur wie folgt aus.
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.
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.