2.7. Lists¶
Eine Liste ist eine veränderliche, geordnete Folge von Werten. Anders als Strings und Bytes können Listen Werte beliebiger Typen enthalten, und Sie können Elemente an Ort und Stelle ändern, hinzufügen oder entfernen.
2.7.1. Listen erstellen¶
Eckige Klammern erzeugen ein Listenliteral:
empty = []
nums = [1, 2, 3]
mixed = [1, "two", 3.0, True, None] # any types
nested = [[1, 2], [3, 4], [5, 6]] # lists of lists
Der list-Konstruktor erstellt eine Liste aus jedem Iterable:
>>> list("abc")
['a', 'b', 'c']
>>> list(range(5))
[0, 1, 2, 3, 4]
2.7.2. Länge, Indizierung und Slicing¶
len() gibt die Anzahl der Elemente zurück. Indizierung und Slicing funktionieren genauso wie bei Strings – Positionen beginnen bei 0, negative Indizes zählen vom Ende, und ein Slice außerhalb des gültigen Bereichs wird stillschweigend beschnitten, statt einen Fehler auszulösen:
>>> nums = [10, 20, 30, 40, 50]
>>> len(nums)
5
>>> nums[0]
10
>>> nums[-1]
50
>>> nums[1:4]
[20, 30, 40]
Positive Indizes zählen von vorne; negative Indizes zählen vom Ende.¶
Die Slice-Syntax ist eine Kurzschreibweise für ein slice-Objekt, das Python im Hintergrund erstellt. nums[1:4] ist dasselbe wie nums[slice(1, 4)]. Sie konstruieren ein solches selten von Hand, aber slice() ist gelegentlich nützlich, um einen Slice als Wert zur Wiederverwendung zu speichern:
head = slice(0, 3)
print(nums[head]) # [10, 20, 30]
print(letters[head]) # first three letters, same slice
2.7.3. Eine Liste verändern¶
Listen unterstützen indizierte und geslicte Zuweisung an Ort und Stelle:
>>> nums = [10, 20, 30]
>>> nums[0] = 99
>>> nums
[99, 20, 30]
>>> nums[1:3] = [200, 300, 400] # slice can change the length
>>> nums
[99, 200, 300, 400]
Die gängigsten Listenmethoden:
list.append()– fügt ein einzelnes Element am Ende hinzu.list.extend()– hängt jedes Element aus einem Iterable an.list.insert()– fügt an einer gegebenen Position ein.list.remove()– löscht das erste Vorkommen eines Werts.list.pop()– entfernt ein Element und gibt es zurück (standardmäßig das letzte).list.clear()– entfernt jedes Element.list.sort()– sortiert an Ort und Stelle. Übergeben Siereverse=Truefür absteigende Reihenfolge.list.reverse()– kehrt an Ort und Stelle um.
>>> nums = []
>>> nums.append(1)
>>> nums.extend([2, 3])
>>> nums.insert(0, 99)
>>> nums
[99, 1, 2, 3]
>>> nums.pop()
3
>>> nums.sort()
>>> nums
[1, 2, 99]
Diese Methoden verändern die Liste an Ort und Stelle und geben None zurück. Zu schreiben
nums = nums.sort() # nums is now None -- common bug
ist fast nie das, was Sie wollen; die ursprüngliche nums wurde sortiert, aber die Zuweisung überschreibt dann den Namen mit dem Rückgabewert. Rufen Sie entweder nums.sort() in einer eigenen Zeile auf oder verwenden Sie die eingebaute sorted(), um eine neue sortierte Liste zurückzuerhalten, ohne das Original zu verändern.
2.7.4. Operatoren¶
+verkettet zwei Listen zu einer neuen Liste.*wiederholt eine Liste.inprüft die Mitgliedschaft.
>>> [1, 2] + [3, 4]
[1, 2, 3, 4]
>>> [0] * 5
[0, 0, 0, 0, 0]
>>> 3 in [1, 2, 3]
True
2.7.5. Über eine Liste iterieren¶
Eine for-Schleife durchläuft die Elemente der Reihe nach:
for n in [10, 20, 30]:
print(n)
2.7.6. Aliasing und Veränderung¶
Eine Liste ist ein einzelner Wert im Speicher; mehrere Namen können auf dieselbe Liste zeigen. Eine Veränderung über einen Namen ist über jeden anderen Namen sichtbar, der auf dieselbe Liste zeigt.
a und b zeigen beide auf dieselbe Liste. Eine Veränderung über einen der beiden Namen ändert, was jeder andere Name sieht.¶
>>> a = [1, 2, 3]
>>> b = a
>>> a.append(4)
>>> b
[1, 2, 3, 4] # same object, change is visible
Um eine unabhängige Kopie zu erstellen, slicen Sie die gesamte Liste oder rufen Sie den list-Konstruktor auf:
>>> c = a[:] # or list(a)
>>> a.append(5)
>>> c
[1, 2, 3, 4] # c is unaffected
Dies kopiert nur die oberste Listenebene; verschachtelte Listen werden weiterhin zwischen dem Original und der Kopie geteilt.