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]
Eine Liste aus sechs Zellen, mit positiven Indizes 0..5 oberhalb und negativen Indizes -6..-1 unterhalb jeder Zelle.

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 Sie reverse=True fü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.

  • in prü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.

Zwei Variablen a und b, die beide auf dasselbe Listenobjekt zeigen; das Anhängen an a ist über b sichtbar.

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.