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
.
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.
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)
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.
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.