Der Etiketten-Flughafen: Pythons Objektmodell
·
Kursüberblick
1
Das Etikett ist nicht der Koffer: Namen und Objekte
2
Versiegelte Koffer: veränderlich und unveränderlich
3
Koffer im Koffer: Container und Kopien
4
Wenn ein Koffer übergeben wird: Funktionen und Argumente
5
Zonen und Ausweise: Gültigkeitsbereiche
6
Handgepäck: Closures
7
Der Koffer-Bauplan: Klassen und Instanzen
8
Flughafen-Standardverfahren: Dunder-Methoden
9
Der Bauplan hinter dem Bauplan: Vererbung und MRO
10
Die Kontrolle: das Geheimnis des Attributzugriffs
11
Herrenlose Koffer: Speicher und GC
12
Schließfachnummern: Hash, Gleichheit und Gesamtbild
Zeit 0:00–0:50
Verlustmeldung
LOST-001
Gemeldet von
Park, Sachbearbeitung in einem Reisebüro
Was fehlt
Die Souvenirliste für eine Reisegruppe. Die Liste wurde zur Sicherheit „kopiert“ und in der Kopie ein Magnet ergänzt. Danach stand der Magnet auch in der ursprünglichen Liste.
Erledigt, wenn
Mit Code beweisen, dass beide Listen von Anfang an derselbe Koffer waren, und eine echte Ersatzliste anlegen.
Internationaler Flughafen Haneulseom · Gepäckzentrum
Erster Arbeitstag, früh am Morgen. Schichtleiterin Do Miran drückt dir vor dem Förderband ein Bündel Etiketten in die Hand. „Einen Satz lernst du hier vor allem anderen: Ein Koffer, viele Etiketten.“
Die erste Meldung kommt aus einem Reisebüro. Park, zuständig für die Reisegruppe, hat die Souvenirliste zur Sicherheit ein zweites Mal angelegt, doch alles, was in der Ersatzliste landet, taucht auch in der ursprünglichen Liste auf. Die Schichtleiterin wirft einen Blick auf den Code und lächelt. „Zwei Listen? Zwei Etiketten, meinst du.“
= hängt ein Etikett an (9 min)So sieht der Code der Meldenden aus:
souvenirs = ["postcard", "keyring"]
backup = souvenirs
backup.append("magnet")
print(souvenirs)
# ['postcard', 'keyring', 'magnet']backup = souvenirs kopiert die Liste nicht. Es hängt ein weiteres Etikett namens backup an genau den Koffer, an dem schon das Etikett souvenirs hängt. Es gab von Anfang an nur einen Koffer, und backup.append hat den Magneten in diesen einen Koffer gelegt.
= wird zuerst die rechte Seite ausgewertet. Das ergibt ein Objekt (einen Koffer), und daran wird der Name (das Etikett) auf der linken Seite gebunden.Geh auf der Etikettentafel unten Zeile für Zeile durch. Links stehen die Namensschilder, rechts die Koffer. Vor Zeile 3 musst du erst das Ergebnis vorhersagen, bevor es weitergeht.
Etikettentafel
Schritt 1 / 0
Als Nächstes läuft: 0
Labor wird vorbereitet…
Gerade geändert
Versiegelter Koffer (unveränderlich)
Jedes Objekt hat drei Eigenschaften.
| So prüfst du sie | Am Flughafen wäre das | |
|---|---|---|
| Identität (identity) | id(obj), a is b | die eindeutige Nummer, die in den Kofferboden geprägt ist |
| Typ (type) | type(obj) | die Art des Gepäckstücks (Trolley, Rucksack …) |
| Wert (value) | Vergleich mit == | der Inhalt |
x = ["postcard"]
y = ["postcard"]
print(x == y, x is y)
# True False
print(id(x) == id(y), id(souvenirs) == id(backup))
# False Truex und y sind zwei verschiedene Koffer mit genau demselben Inhalt. == ergibt True, is ergibt False.souvenirs und backup sind derselbe Koffer, deshalb ist auch ihre id gleich.id liefert, hat für sich genommen keine Bedeutung. In CPython ist sie die Speicheradresse, und sie ändert sich bei jedem Programmlauf. Verwende sie nur zum Vergleichen.print(type(x), type(len))
# <class 'list'> <class 'builtin_function_or_method'>Pin sagt
→ is fragt: „Ist das derselbe Koffer?“ == fragt: „Ist der Inhalt gleich?“ Werte vergleichst du immer mit ==. is brauchst du nur für Objekte, die es genau einmal gibt, wie bei x is None.
Nicht nur Zahlen und Listen sind Objekte. Auch Funktionen, Klassen und Module sind Objekte, die an Namen gebunden sind.
shout = print
shout("boarding")
# boarding
print(shout is print)
# True
def greet():
return "hi"
print(type(greet), greet.__name__)
# <class 'function'> greet
alias = greet
del greet
print(alias())
# hidef greet(): erzeugt ein Funktionsobjekt und bindet den Namen greet daran. Das ist im Grunde auch eine Zuweisung.del greet den Namen ab, bleibt die Funktion trotzdem erhalten, denn alias zeigt weiterhin auf dasselbe Funktionsobjekt.type(int) als auch type(type) ergeben <class 'type'>. Darauf kommen wir in Lektion 7 zurück.Mit einem Namen kannst du genau zwei Dinge tun:
a = .... Der Name wird an ein anderes Objekt gebunden. Der ursprüngliche Koffer bleibt, wie er ist.a.append(...), a[0] = .... Der Name bleibt, aber der Inhalt des Koffers ändert sich. Das sieht man über jeden Namen, der auf denselben Koffer zeigt.a = [1, 2]
b = a
a = a + [3]
print(a, b, a is b)
# [1, 2, 3] [1, 2] Falsea = [1, 2]
b = a
a.append(3)
print(a, b, a is b)
# [1, 2, 3] [1, 2, 3] Truea + [3] erzeugt eine neue Liste, und a = hängt das Etikett a an diese neue Liste um. b bleibt am ursprünglichen Koffer. append dagegen verändert den Koffer selbst, deshalb sieht man die Änderung auch über b. Probier unten beide Varianten abwechselnd aus.
Etikettentafel
Schritt 1 / 0
Als Nächstes läuft: 0
Labor wird vorbereitet…
Gerade geändert
Versiegelter Koffer (unveränderlich)
1 und 2 direkt als Werte in den Fächern statt als Pfeile, weil es kleine Werte sind. In Wirklichkeit sind auch sie Objekte, und die Liste enthält Referenzen auf diese Objekte (Lektion 3).a += [3]? Bei Listen ist das ein Verändern des Koffers. Bei Zahlen oder Strings dagegen wird das Etikett umgehängt. Um diese zwei Gesichter geht es in Lektion 2.del nimmt das Etikett ab, nicht den Koffer (6 min)c = ["tag"]
d = c
del c
print(d)
# ['tag']
print(c)
# NameError: name 'c' is not defineddel c entfernt nur den Namen c, nicht die Liste. Weil d noch auf sie zeigt, bleibt der Koffer erhalten. Wirklich verschwinden wird ein Koffer erst, wenn kein einziges Etikett mehr auf ihn zeigt (Lektion 11).
Auch das Vertauschen zweier Namen mit p, q = q, p ist ein Umhängen von Etiketten. Zuerst wird aus q, p auf der rechten Seite ein Tupel gebildet, dann werden die Namen links der Reihe nach an die Objekte darin gebunden.
p, q = "left", "right"
p, q = q, p
print(p, q)
# right leftHier ist der Beweis, dass die beiden Listen der Meldenden derselbe Koffer waren, und so legst du eine echte Ersatzliste an:
souvenirs = ["postcard", "keyring"]
backup = souvenirs
backup.append("magnet")
print(souvenirs is backup, id(souvenirs) == id(backup))
# True True
safe = list(souvenirs) # einen neuen Koffer mit demselben Inhalt anlegen
safe.append("mug")
print(souvenirs, safe, safe is souvenirs)
# ['postcard', 'keyring', 'magnet'] ['postcard', 'keyring', 'magnet', 'mug'] Falselist(souvenirs) erzeugt eine neue Liste. Jetzt kann in safe ruhig ein Becher landen, die ursprüngliche Liste bleibt unberührt. (Dass diese Kopie nur „eine Ebene tief“ neu angelegt wird, behandeln wir in Lektion 3.)
Kurz vor Feierabend zeigt Pin in Richtung Band 13. Dort sollen zwei Koffer ohne ein einziges Etikett unablässig ihre Runden drehen. Die Schichtleiterin sagt nur: „Ohne Etikett hätten die längst weggeräumt sein müssen.“ Dann schaltet sie den Bildschirm aus.
Abschlussbericht — LOST-001. Es gab von Anfang an nur eine Liste, nur eben mit zwei Etiketten. Mit is und id nachgewiesen, mit list() eine neue Liste angelegt und so gelöst.
y, wenn du nacheinander x = [0], y = x und x = [1] ausführst? Zeichne zuerst das Bild, dann prüfe es durch Ausführen.a = [1, 2]. Lege b = a[:] und c = a an und sag die Ergebnisse von a is b, a is c und a == b voraus.print einen anderen Namen gibst und dann del print ausführst? Wo eingebaute Namen wohnen, lernst du in Lektion 5.Das Notizbuch der Schichtleiterin
Eine Variable ist keine Kiste, sondern ein Namensschild. = bindet den Namen links an das Objekt rechts.
Drei Dinge an jedem Objekt: Identität (id, is), Typ (type), Wert (==).
is prüft, ob es dasselbe Objekt ist, == prüft, ob die Werte gleich sind. Werte vergleicht man immer mit ==.
Auch Funktionen, Klassen und Module sind Objekte. Auch def ist eine Zuweisung, die einen Namen bindet.
Neubindung (a = …) hängt den Namen um, Mutation (a.append …) verändert das Objekt.
del nimmt nur den Namen ab. Ein Objekt verschwindet erst, wenn nichts mehr auf es zeigt.
Über neue Lektionen informiert werden
Wir schicken dir eine E-Mail, wenn dieser Kurs neue Lektionen bekommt oder ein Folgekurs erscheint.
R
ReflexKR
Python und Reflex zum Anfassen. Alle Beispiele wurden mit Reflex 0.10.0 ausgeführt und geprüft.
ReflexKR ist kostenlos und ohne Werbebanner. Wenn es dir geholfen hat, kannst du es mit einem Kaffee unterstützen. ☕ Spendier uns einen Kaffee
Hinweis zu Affiliate-Links© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0
Fragen & Antworten
Frag alles zu dieser Lektion. Fragen aus allen Sprachversionen dieser Seite erscheinen hier gemeinsam.