Änderungen von Listen in Python
Eine Liste kann verändert werden, etwa durch eine Zuweisung an eine Bindungsstelle der Liste.
- Konsolenprotokoll
l =[ 0, 1, 2 ]
l
[0, 1, 2]
l[ 0 ]= 77
l
[77, 1, 2]
Sogar Zuweisungen an Auswahlen von Bindungstellen sind möglich!
- Konsolenprotokoll
l =[ 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ]
l[ 2: 7 ]=[ 30, 31 ]
l
[20, 21, 30, 31, 27, 28, 29]
Das kann auch zum Anhängen benutzt werden.
- Konsolenprotokoll
l =[ 0, 1, 2 ]
l[ 3: 4 ]= 'a'
l
[0, 1, 2, 'a']
l[ 4: 5 ]=[ 'x', 'y', 'z' ]
l
[0, 1, 2, 'a', 'x', 'y', 'z']
Die Verwendung von Auswahlen ist ein weites Feld, das hier nicht zu sehr vertieft werden soll. Wir zeigen aber noch eine Technik, die es erlaubt, einer Liste einen vollständig neuen Wert zu geben, ohne ihre Identität zu verändern.
- Konsolenprotokoll
l =[ 1, 2, 3, 4, 5 ]
o = id( l )
l[ : ]=[ "a", "b", "c" ]
print( o == id( l ))
True
Das Löschen einer Bindungsstelle erfolgt mit der Löschanweisung.
- Konsolenprotokoll
l =[ 20, 21, 22, 23, 24, 25 ]
del l[ 1 ]
[20, 22, 23, 24, 25]
Unveränderliche Objekte
Viele Arten von Objekte in Python sind aus gutem Grund unveränderlich. Dazu gehören Tupel und Zeichenfolgen.
- Konsolenprotokoll
t = 1, 2, 3
t
(1, 2, 3)
t[ 0 ]
1
t[ 0 ]= 5
TypeError: 'tuple' object does not support item assignment
- Konsolenprotokoll
s = "abc"
s
'abc'
s[ 0 ]
'a'
s[ 0 ]= 'x'
TypeError: 'str' object does not support item assignment
Veränderungen von Listen können mit Tupeln durch Bindung an ein neues Tupel imitiert werden.
- Konsolenprotokoll
t = 1, 2, 3
t =( 17 )+(1, 2, 3)
t[ 0 ]
1
t[ 0 ]= 5
TypeError: 'tuple' object does not support item assignment
Der Aliaseffekt
Im folgenden Beispiel gibt es scheinbar die Liste ›a‹ und die Liste ›b‹. Verblüffenderweise wirkt sich eine Änderung an ›a‹ aber auf ›b‹ aus. Warum?
- Konsolenprotokoll
a =[ 1, 2, 3 ]
b = a
a[ 1 ]= 7
a
[1, 7, 3]
b
[1, 7, 3]
›a‹ und ›b‹ sind nur zwei verschiedene Namen, die beide an dieselbe Liste gebunden sind!
- Konsolenprotokoll
a == b
True
a is b
True
Durch die Auswahl »:« kann aber eine Kopie einer Liste als separates Objekt angelegt werden.
- Konsolenprotokoll
a =[ 1, 2, 3 ]
b = a[ : ]
a == b
True
a is b
False
a[ 1 ]= 7
a
[1, 7, 3]
b
[1, 2, 3]
Bei Strings oder Tupel kopiert »:« aber nicht. Da diese Objekte unveränderlich sind, gibt es keinen Bedarf für Kopien.
- Konsolenprotokoll
a =( 1, 2, 3 )
b = a[ : ]
a is b
True
- Konsolenprotokoll
a = "123"
b = a[ : ]
a is b
True
Übungsfragen
? Änderungen an verschachtelten Listen
In der unten definierten Liste ›a‹ soll die an ›1‹ gebundene Stelle an ›7‹ gebunden werden. Dazu soll eine mit »= 7« endende Bindungsanweisung verwendet werden. Was muß auf der linken Seite jener Bindungsanweisung stehen?
- Vorbereitung
a =[ [ 1, 2 ], [ 3, 4 ]]
- Diese Ausgabe zeigt, welche Änderung hervorgerufen werden soll
print( a )
[[7, 2], [3, 4]]
? Erstellen einer homogenen Liste
Was wäre eine kurze Schreibweise zum Anlegen einer Liste mit dem Namen »a«, die zwanzigmal den Wert «0» enthält?
- Diese Ausgabe zeigt, welche Änderung hervorgerufen werden soll
print( a )
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]