Wie man in Python Daten ablegt, ohne sich später zu ärgern — die Standard-Container.
Grundlagen 13 min Einsteiger 26. April 2026
Bisher speichert jede Variable genau einen Wert — eine Zahl, einen String, ein Boolean. Aber echte Programme arbeiten mit Sammlungen: eine Liste mit 1.000 Studentennamen, ein Nutzerprofil mit Name, Alter und Stadt, oder eine API-Antwort mit hunderten Datenpunkten. 1.000 einzelne Variablen zu verwalten ist wie 1.000 lose Zettel statt eines geordneten Notizbuchs.
Python bietet zwei fundamentale Sammlungstypen: Listen für geordnete Sequenzen (wenn die Reihenfolge zählt) und Dictionaries für Schlüssel-Wert-Paare (wenn du nach Namen nachschlagen willst). Diese beiden Strukturen sind so zentral, dass fast jedes Python-Programm mindestens eine davon verwendet.
Listen — Geordnete Sammlungen mit nummerierten Plätzen
Liste (list)
AnalogieDefinition
Eine Liste ist wie ein nummeriertes Regal in einer Werkstatt. Jedes Fach hat eine Nummer, beginnend bei 0 — Fach 0, Fach 1, Fach 2. Du kannst jeden Gegenstand in jedes Fach legen, neue Fächer am Ende anhängen (append), ein Fach entfernen und alles danach nachrutschen lassen (pop), oder ein neues Fach in der Mitte einfügen (insert). Um etwas zu finden, kennst du entweder die Fachnummer (Indexzugriff) oder du schaust alle Fächer durch (der in-Operator).
Analogie:
Eine Liste ist wie ein nummeriertes Regal in einer Werkstatt. Jedes Fach hat eine Nummer, beginnend bei 0 — Fach 0, Fach 1, Fach 2. Du kannst jeden Gegenstand in jedes Fach legen, neue Fächer am Ende anhängen (append), ein Fach entfernen und alles danach nachrutschen lassen (pop), oder ein neues Fach in der Mitte einfügen (insert). Um etwas zu finden, kennst du entweder die Fachnummer (Indexzugriff) oder du schaust alle Fächer durch (der in-Operator).
Definition:
Eine Python-Liste (list) ist eine geordnete, veränderbare Sequenz von Elementen. "Geordnet" bedeutet: Die Position jedes Elements bleibt erhalten und ist bedeutungsvoll — das erste Element bleibt das erste, bis du die Liste änderst. "Veränderbar" (mutable) bedeutet: Du kannst Elemente hinzufügen, entfernen und ersetzen, ohne eine neue Liste zu erstellen. Jedes Element wird über seinen Index angesprochen, beginnend bei 0. Listen können beliebige Typen mischen: [42, "Anna", True, [1, 2]].
Die Regal-Analogie passt gut für nummerierte Positionen und das Verschieben bei Einfügen/Entfernen. Sie bricht, weil ein echtes Regal eine feste Anzahl Fächer hat — Python-Listen wachsen dynamisch. Außerdem haben Regalfächer physische Größenbeschränkungen, während Python-Listen beliebige Objekte halten können, inklusive anderer Listen.
Einkaufsliste Schritt für Schritt
1
einkauf = ["Brot", "Milch", "Äpfel"] → 3 Elemente an Position 0, 1, 2
2
einkauf.append("Käse") → 4 Elemente: [..., "Käse"] an Position 3
3
print(einkauf[0]) → "Brot" (erstes Element = Index 0)
Jeder Schritt zeigt den Zustand der Liste nach der Operation. Beachte: Nach pop(1) rutschen alle Elemente rechts davon eine Position nach links.
Vorsicht: IndexError
Der Index muss zwischen 0 und len(liste) - 1 liegen. Ein Zugriff außerhalb dieser Grenzen löst einen IndexError aus. Weil Python bei 0 anfängt, ist liste[3] das vierte Element — nicht das dritte.
farben = ["rot", "grün", "blau"]
print(farben[3]) # IndexError: list index out of range
# Gültige Indizes: 0, 1, 2
Dictionaries — Nachschlagen statt Durchzählen
Dictionary (dict)
AnalogieDefinition
Ein Dictionary ist wie ein Telefonbuch. Du schlägst nicht "den 47. Eintrag" nach — du suchst einen Namen (den Key), um die Telefonnummer (den Value) zu finden. Das Telefonbuch garantiert, dass jeder Name nur einmal vorkommt (eindeutige Keys), und das Nachschlagen ist schnell, egal wie dick das Buch ist. Wenn du einen Namen suchst, der nicht eingetragen ist, bekommst du einen Fehler (KeyError) — oder du fragst mit .get(): "Hast du Max Müller? Wenn nicht, sag einfach 'unbekannt'."
Analogie:
Ein Dictionary ist wie ein Telefonbuch. Du schlägst nicht "den 47. Eintrag" nach — du suchst einen Namen (den Key), um die Telefonnummer (den Value) zu finden. Das Telefonbuch garantiert, dass jeder Name nur einmal vorkommt (eindeutige Keys), und das Nachschlagen ist schnell, egal wie dick das Buch ist. Wenn du einen Namen suchst, der nicht eingetragen ist, bekommst du einen Fehler (KeyError) — oder du fragst mit .get(): "Hast du Max Müller? Wenn nicht, sag einfach 'unbekannt'."
Definition:
Ein Python-Dictionary (dict) ist eine veränderbare Sammlung, die eindeutige Keys auf Werte abbildet. Statt über die Position (wie bei Listen) greifst du über einen aussagekräftigen Schlüssel zu: person["name"] gibt den Wert zum Key "name". Keys müssen unveränderlich sein (Strings, Zahlen, Tupel); Werte dürfen beliebige Objekte sein. Seit Python 3.7 bewahren Dictionaries die Einfügereihenfolge, aber der Key (nicht die Position) bleibt die primäre Zugriffsmethode.
Die Telefonbuch-Analogie passt für Key-basierten Zugriff und Eindeutigkeit. Sie bricht, weil ein echtes Telefonbuch alphabetisch sortiert ist — Python-Dicts nutzen Hash-Tabellen, nicht alphabetische Ordnung. Außerdem enthält ein Telefonbuch nur Name-Nummer-Paare, während Python-Dicts beliebige Werte abbilden können, inklusive verschachtelter Dicts und Listen.
Beispiel: Personendaten
person = {"name": "Anna", "alter": 28, "stadt": "Berlin"}
print(person["alter"]) # 28
person["beruf"] = "Ingenieurin" # neues Key-Value-Paar
print(person.get("hobby", "unbekannt")) # "unbekannt" (kein Fehler)
for key, value in person.items():
print(f"{key}: {value}") # gibt alle Paare aus
Der .get()-Aufruf ist das sichere Gegenstück zu person["hobby"], das mit KeyError abstürzen würde. Verwende .get() immer dann, wenn du nicht sicher bist, ob ein Key existiert.
Liste
Geordnete Sequenz. Zugriff über Index (Position). Verwende Listen, wenn die Reihenfolge wichtig ist: Einkaufslisten, Schrittfolgen, Sammlungen zum Durchlaufen.
Dictionary
Schlüssel-Wert-Zuordnung. Zugriff über Key (Name). Verwende Dicts, wenn du nach Namen nachschlagen willst: Nutzerprofile, Konfigurationen, Wortzähler.
Vorsicht: KeyError
Ein Zugriff mit dict[key] auf einen nicht existierenden Key löst einen KeyError aus. Verwende stattdessen .get(key, default) für sicheren Zugriff.
Aliasing ist wie ein geteiltes Online-Dokument. Stell dir vor, du und ein Kollege habt beide einen Link zum selben Google Doc. Wenn dein Kollege einen Absatz ändert, siehst du die Änderung sofort — weil ihr beide dasselbe Dokument betrachtet, nicht getrennte Kopien. Eine Kopie mit a.copy() zu erstellen ist wie "Kopie erstellen" in Google Docs zu klicken — jetzt hat jeder seine eigene Version.
Analogie:
Aliasing ist wie ein geteiltes Online-Dokument. Stell dir vor, du und ein Kollege habt beide einen Link zum selben Google Doc. Wenn dein Kollege einen Absatz ändert, siehst du die Änderung sofort — weil ihr beide dasselbe Dokument betrachtet, nicht getrennte Kopien. Eine Kopie mit a.copy() zu erstellen ist wie "Kopie erstellen" in Google Docs zu klicken — jetzt hat jeder seine eigene Version.
Definition:
Weil Listen und Dictionaries veränderbare Objekte sind, erstellt die Zuweisung b = a keine Kopie der Daten — sie erzeugt einen zweiten Namen (Alias), der auf dasselbe Objekt im Speicher zeigt. Nach b = a verweisen beide auf dieselbe Liste. b[0] zu ändern ändert auch a[0], weil es nur eine Liste mit zwei Namen gibt. Für eine unabhängige Kopie verwende a.copy(), list(a) oder a[:] für Listen und a.copy() oder dict(a) für Dictionaries. Diese erzeugen flache Kopien — der äußere Container ist neu, aber verschachtelte Objekte teilen sich weiterhin Referenzen.
Die Dokument-Analogie passt für "zwei Links, ein Objekt". Sie bricht, weil in der Realität das Teilen eines Dokuments eine bewusste Entscheidung ist (du schickst einen Link), während Aliasing in Python automatisch und stillschweigend passiert, wenn du b = a schreibst. Anfänger merken nicht, dass sie das Objekt "teilen".
Die Aliasing-Falle Schritt für Schritt
1
a = [1, 2, 3] → Liste mit drei Elementen erstellt
2
b = a → b ist ein Alias, KEINE Kopie! Beide zeigen auf dieselbe Liste.
3
b.append(4) → Die Liste ist jetzt [1, 2, 3, 4]
4
print(a) → [1, 2, 3, 4] — a hat sich auch geändert! Fix: b = a.copy()
Aliasing ist lautlos und automatisch
b = a kopiert NICHT. Es erzeugt einen zweiten Namen für dasselbe Objekt. Verwende immer .copy() für eine unabhängige Kopie. Dies gilt für Listen UND Dictionaries.
# Alias (NICHT kopiert):
b = a
b.append(4) # ändert auch a!
# Echte Kopie:
b = a.copy()
b.append(4) # a bleibt unverändert
Liste Geordnete Sequenz mit nummerierten Positionen (ab 0)
Dictionary Schlüssel-Wert-Zuordnung für schnelles Nachschlagen
IndexError Zugriff auf eine Position außerhalb der Listenlänge
KeyError Zugriff auf einen Key, der im Dictionary nicht existiert
Interaktiv: Python-Sammlungstypen im Vergleich
Du kennst jetzt Listen und Dictionaries. Aber Python hat noch zwei weitere Sammlungstypen: Sets und Tuples. Klicke auf eine Zeile in der Vergleichs-Matrix, um die Eigenschaften und typischen Einsatzbereiche jedes Typs zu sehen. Achte besonders auf die Farbkodierung: Grün zeigt vorhandene Fähigkeiten, Rot zeigt Einschränkungen.
Python-Sammlungstypen im Vergleich
Vorteil (klein/schnell/hoch)
Neutral
Nachteil (groß/langsam/niedrig)
Zeile anklicken für Detailansicht
Typ
Geordnet
Veränderbar
Duplikate
Zugriff
▸list
✓
✓
✓
Index [i]
▸dict
✓
✓
✗ Keys
Key ["k"]
▸set
✗
✓
✗
—
▸tuple
✓
✗
✓
Index [i]
Kernaussage: Die Wahl des richtigen Sammlungstyps hängt von drei Fragen ab: Brauchst du eine bestimmte Reihenfolge? Soll die Sammlung veränderbar sein? Müssen Elemente eindeutig sein? Die Matrix zeigt auf einen Blick, welcher Typ welche Anforderungen erfüllt.
Deep Dive: Warum zählt Python ab 0?
Guido van Rossum, der Erfinder von Python, erklärte die Entscheidung 2013 in einem Blogpost: Halboffene Intervalle wie a[:n] für die ersten n Elemente und a[n:] für den Rest funktionieren mit 0-basierten Indizes besonders sauber, ohne lästige +1/-1-Korrekturen. Dieses Design stammt aus der C-Tradition, die Python stark beeinflusst hat.
Ein praktischer Vorteil: len(liste) ist immer der erste ungültige Index — das macht Grenzprüfungen einfach.
Deep Dive: Listen, Dicts und JSON
JSON (JavaScript Object Notation) ist das Standardformat für Web-APIs, KI-Modellkonfigurationen und Datenaustausch. Beim Einlesen mit json.loads() werden JSON-Objekte direkt zu Python-Dicts und JSON-Arrays zu Python-Listen.
Wer Listen und Dictionaries versteht, versteht damit auch den Aufbau realer Datenformate — von API-Antworten bis zu Konfigurationsdateien.
Das Wichtigste auf einen Blick
Eine Liste ist eine geordnete, veränderbare Sequenz mit Indexzugriff (ab 0). Verwende Listen, wenn die Reihenfolge wichtig ist — Einkaufslisten, Schrittfolgen, Sammlungen zum Durchlaufen.
Ein Dictionary ist eine veränderbare Sammlung von Schlüssel-Wert-Paaren mit Key-Zugriff. Verwende Dicts, wenn du nach Namen nachschlagen willst — Nutzerprofile, Konfigurationen, Wortzähler.
b = a kopiert weder eine Liste noch ein Dictionary — es erzeugt einen zweiten Namen für dasselbe Objekt. Verwende a.copy() oder list(a) für eine unabhängige Kopie.
Häufige Fallen: IndexError (Zugriff über Listenlänge hinaus), KeyError (Zugriff auf fehlenden Dict-Key — verwende .get()), Off-by-One-Fehler durch 0-basierte Indizierung.
JSON — das Format für Web-APIs und KI-Dienste — bildet direkt auf Python-Dictionaries und -Listen ab. Wer diese beiden Typen versteht, versteht die Struktur realer Daten.
Quiz: Listen und Dictionaries
Frage 1 / 4
Noch offen
Was gibt farben[1] zurück, wenn farben = ["rot", "grün", "blau"]?
1. Was gibt farben[1] zurück, wenn farben = ["rot", "grün", "blau"]?
☐ A) "rot"
☐ B) "grün"
☐ C) "blau"
☐ D) IndexError
2. person = {"name": "Anna", "alter": 28}. Was gibt person.get("hobby", "unbekannt") zurück?
☐ A) KeyError
☐ B) None
☐ C) "unbekannt"
☐ D) "hobby"
3. a = [1, 2, 3]; b = a; b.append(4). Was ist a jetzt?
☐ A) [1, 2, 3]
☐ B) [1, 2, 3, 4]
☐ C) [4, 1, 2, 3]
☐ D) Fehler
4. Du willst 500 Nutzerprofile speichern (je Name, E-Mail, Alter). Welche Struktur passt am besten?
☐ A) 500 einzelne Variablen
☐ B) Eine Liste mit 500 Dictionaries
☐ C) Ein Dictionary mit 500 Listen
☐ D) 3 separate Listen (eine für Namen, eine für E-Mails, eine für Alter)
Auflösung: 1) B · 2) C · 3) B · 4) B
Checkpoint: Verstehst du Listen und Dictionaries?
Du hast die Liste farben = ["rot", "grün", "blau"]. Was gibt farben[1] zurück? Und was passiert bei farben[5]?
Du hast person = {"name": "Anna"}. Was ist der Unterschied zwischen person["hobby"] und person.get("hobby", "unbekannt")?
Du schreibst b = a und änderst danach b. Warum ändert sich a mit? Wie verhinderst du das?