Viele Werte, ein Name
Bisher kennst du Variablen als Schubladen für einzelne Werte. Doch wie legst du die Belegung der 8 × 8 Felder eines Schachbretts oder die Punkte aller Spielrunden sinnvoll ab? Eine Variable pro Feld wären 64 Schubladen.
![Ein Schrank mit fünf Schubladen zahlen[0] bis zahlen[4] mit den Werten 16, 4, 2 und 1; die Schublade zahlen[1] ist herausgezogen und bekommt den Wert 4711](https://picoboy.de/wp-content/uploads/2026/11/pb-liste-schrank-v3.png)
Hier helfen Listen. Eine Liste speichert eine geordnete Sammlung von Elementen – zum Beispiel Zahlen oder Wörter. Auf die einzelnen Elemente greifst du über einen Index zu, der die Position angibt. Gezählt wird ab 0: Das erste Element hat den Index 0, das zweite den Index 1 und so weiter.
Über den Index kannst du ein Element lesen und ihm einen neuen Wert zuweisen.
Lesen und ändern
Im folgenden Beispiel siehst du, wie eine Liste verwendet wird. Beachte die Ähnlichkeit zur Verwendung von Variablen.
zahlen = [16, 8, 4, 2, 1] # Eine Liste mit fünf Werten wird angelegt. print(zahlen[1]) # Der zweite Wert (Index 1) wird ausgegeben: 8 zahlen[1] = 4711 # Der zweite Wert wird auf 4711 gesetzt. print(zahlen[1]) # Der neue zweite Wert wird ausgegeben: 4711
Eine Liste mit fünf Elementen hat die Indizes 0 bis 4. Ein Zugriff auf
zahlen[5]bricht mit der Fehlermeldung „IndexError“ ab.
Vollständig sieht die Meldung so aus:
Traceback (most recent call last): File "<stdin>", line 2, in <module> IndexError: list index out of range
Der Index gehört in eckige Klammern. Schreibst du zahlen(1) mit runden Klammern, hält Python die Liste für eine Funktion und meldet TypeError: 'list' object isn't callable.
Listen anlegen und erweitern
Oft kennst du die Werte am Anfang noch nicht. Dann legst du eine leere Liste an und hängst die Elemente mit append() hinten an:
zahlen = [] # Eine leere Liste anlegen
zahlen.append(int(input("Erste Zahl: "))) # Eingabe als Zahl hinten anhängen
zahlen.append(int(input("Zweite Zahl: "))) # Noch eine Eingabe anhängen
print(zahlen) # Die ganze Liste ausgeben, z.B. [3, 7]
print(zahlen[0] + zahlen[1]) # Mit den beiden Werten rechnen
print(len(zahlen)) # Anzahl der Elemente ausgeben: 2
len() liefert die Länge der Liste, also die Anzahl ihrer Elemente. Wörter kommen genauso in eine Liste wie Zahlen, in Anführungszeichen: namen = ["Ada", "Tom", "Mia"].
Eine Liste wächst nur mit append(). Eine Zuweisung wie zahlen[2] = 5 ändert ein vorhandenes Element. Gibt es Index 2 noch nicht, erhältst du wieder den IndexError.
Soll die Liste von Anfang an eine feste Länge haben, füllst du sie mit Platzhaltern. Die folgende Zeile erzeugt eine Liste aus fünf Nullen:
zahlen = [0 for x in range(5)] # Liste mit fünf Elementen, alle auf 0 gesetzt
zahlen[0] = int(input("Erste Zahl eingeben: "))
zahlen[1] = int(input("Zweite Zahl eingeben: "))
print(zahlen[0])
print(zahlen[1])
Lies die erste Zeile von links nach rechts: „eine 0 für jeden Wert in range(5)“. range(5) liefert fünf Werte, also entstehen fünf Nullen. Das x zählt nur mit und wird sonst nicht gebraucht. Die Liste ist danach dasselbe wie [0, 0, 0, 0, 0], und ihre fünf Plätze kannst du jetzt ohne append() belegen.
Das int() ist wichtig: input() liefert immer Text. Ohne die Umwandlung landen Zeichenketten in der Liste und du kannst nicht mit ihnen rechnen.
Listen durchlaufen
Jetzt zahlt sich die for-Schleife aus. Sie kann eine Liste direkt durchlaufen, ohne dass du dich um Indizes kümmern musst:
zahlen = [16, 8, 4, 2, 1] for zahl in zahlen: # Die Variable "zahl" nimmt nacheinander jeden Wert der Liste an print(zahl) # und wird jeweils ausgegeben.
Die Schleife nimmt im ersten Durchlauf den ersten Wert, im zweiten den zweiten und so weiter. Sie endet von selbst beim letzten Element, egal wie lang die Liste ist.
Brauchst du zusätzlich den Index, kombinierst du range() mit len():
zahlen = [16, 8, 4, 2, 1] for i in range(0, len(zahlen)): # i läuft von 0 bis 4 print(i, ":", zahlen[i]) # Index und Wert ausgeben
Die Ausgabe beginnt mit 0 : 16, dann folgt 1 : 8. Wie in Schritt 2 trennt das Komma die Teile, und print() setzt je ein Leerzeichen dazwischen. Weil dort len(zahlen) steht und nicht die feste Zahl 5, stimmt die Schleife auch dann noch, wenn die Liste länger wird.
Wenn die Liste sich nicht ändert
Wer Werte einer Liste in einer Schleife ändern will, stolpert leicht über diesen Unterschied:
zahlen = [16, 8, 4, 2, 1] for zahl in zahlen: # "zahl" ist nur eine Kopie des Werts zahl = 0 # Das ändert die Kopie, nicht die Liste print(zahlen) # Ausgabe: [16, 8, 4, 2, 1] for i in range(0, len(zahlen)): # Über den Index erreichst du die Liste selbst zahlen[i] = 0 # Das ändert das Element in der Liste print(zahlen) # Ausgabe: [0, 0, 0, 0, 0]
Zum Lesen reicht also for zahl in zahlen. Zum Ändern brauchst du den Index.
Eine Liste auf dem Display
Listen und Schleifen zusammen ergeben schon ein kleines Balkendiagramm:
from picoboy import PicoBoy pb = PicoBoy() # Den Teil oberhalb dieser Zeile nicht verändern werte = [10, 25, 40, 15, 60, 30, 45, 20] # Acht Höhen, eine pro Balken pb.fill(0) for i in range(0, len(werte)): # i läuft von 0 bis 7 hoehe = werte[i] pb.fill_rect(i * 16, 63 - hoehe, 14, hoehe, 1) # Balken, alle unten bündig pb.show()
Das Programm holt sich in jedem Durchlauf eine Höhe aus der Liste und zeichnet daraus einen Balken:
i * 16rückt jeden Balken um 16 Pixel nach rechts. Der Balken ist 14 Pixel breit, also bleiben 2 Pixel Abstand. Acht Balken mal 16 Pixel ergeben genau die Displaybreite von 128.63 - hoeheberechnet die obere Kante. Die y-Werte zählen von oben nach unten, undpb.fill_rect()zeichnet von der oberen Kante nach unten. Damit alle Balken unten beginnen, muss ein hoher Balken also weiter oben anfangen.
Übung: ein neunter Balken
Füge vor der Schleife die Zeile werte.append(50) ein. len(werte) ist nun 9, und die Schleife läuft von selbst einmal mehr. Einen neuen Balken siehst du trotzdem nicht: Er beginnt bei x = 128 und liegt damit neben dem Display. Eine Fehlermeldung gibt es nicht, denn Zeichenbefehle außerhalb des Displays bleiben einfach ohne Wirkung. Wie musst du i * 16 und die Breite 14 ändern, damit alle neun Balken passen?
Listen in Listen: das Schachbrett
Zurück zur Frage vom Anfang: Ein Schachbrett hat 8 Zeilen mit je 8 Feldern. Dafür legst du eine Liste an, deren Elemente selbst Listen sind. Das erste Paar eckiger Klammern wählt die Zeile aus, das zweite das Feld darin:
from picoboy import PicoBoy
pb = PicoBoy()
# Den Teil oberhalb dieser Zeile nicht verändern
brett = [[0 for x in range(8)] for y in range(8)] # 8 Zeilen mit je 8 Nullen
brett[0][3] = 1 # Zeile 0, Spalte 3 belegen
brett[4][6] = 1 # Zeile 4, Spalte 6 belegen
pb.fill(0)
pb.rect(32, 0, 64, 64, 1) # Rahmen des Bretts
for zeile in range(0, 8): # Jede Zeile durchgehen
for spalte in range(0, 8): # Jede Spalte durchgehen
if brett[zeile][spalte] == 1: # Belegt? Stein zeichnen
pb.fill_rect(32 + spalte * 8 + 2, zeile * 8 + 2, 4, 4, 1)
pb.show()
Die erste Zeile baut acht Listen aus je acht Nullen. Die verschachtelten Schleifen gehen dann alle 64 Felder durch, genau wie beim Punkteraster im vorigen Schritt. Das Brett beginnt bei x = 32, damit es mittig steht. Die + 2 setzen den 4 Pixel großen Stein in die Mitte seines 8 Pixel großen Felds. Das Beispielprojekt Snake speichert sein Spielfeld auf dieselbe Weise.
Mit Listen und dem Zugriff über den Index verwaltest du Daten also übersichtlich – Sensorwerte, Spielfelder, Highscores oder die Positionen aller Gegner in einem Spiel.
Übung
Lege eine Liste mit acht Zahlen an und gib mit einer for-Schleife nur die geraden Werte aus. Tipp: Eine Zahl ist gerade, wenn zahl % 2 == 0 ist. Das % kennst du aus Schritt 2: Es liefert den Rest der Division. In der Schleife fragst du also mit einem if jede Zahl einzeln ab.