3.5. Datenmodell#
Zahlreiche Eigenschaften von Python sind direkte Folgen von Pythons Datenmodell. Deshalb gehen wir hier kurz auf Pythons Datenmodell ein.
Wie Sie schon wissen, sind Daten für den Computer immer nur Bits. Ob eine Bitfolge „eine Zahl“ oder „Text“ bedeutet, hängt von ihrer Interpretation ab.
Genau hier kommt das Datenmodell ins Spiel: In Python werden Werte als Objekte modelliert. Ein Objekt hat
(mindestens) einen Wert,
einen Typ und
eine Identität.
Variablennamen sind keine „Speicherzellen“, sondern Bindungen auf solche Objekte. Der Typ des Objekts bestimmt, wie die zugrunde liegenden Bits zu interpretieren sind (z.B. als int oder als str).
Sehen wir uns hierzu das folgende Code‑Beispiel an:
x = 100
identitaet = id(x)
print("id(x):", identitaet) # Identität (Adresse/Referenzwert)
print("x:", x) # Wert
id(x): 94669783435272
x: 100
Auf den ersten Blick wirkt es so, als würde der Zahlenwert 100 „in“ der Variable x abgespeichert werden.
Unter der Haube passiert aber etwas anderes:
xist nur ein Name, der an einint‑Objekt gebunden wird.Dieses Objekt hat
einen Wert („100“),
einen Typ (
int)und eine Identität („dieses konkrete Objekt“).
Diese Identität können Sie mit
id(...)sichtbar machen (in CPython ist das oft die Speicheradresse).
Abb. 3.6 Ein Objekt hat eine Identität (id) und einen Wert; Variablennamen sind Bindungen auf Objekte.#
Das Zuweisungszeichen = ist in Python eine Zuweisung/Bindung (kein mathematisches Gleichheitszeichen).
x = 13 bedeutet: „Binde den Namen x an das Objekt 13“ – nicht „lege 13 in eine Variable ab“.
Abb. 3.7 Der Arbeitsspeicher ist eine sehr lange Liste bestehend aus Bits.#
Name und Wert
Im Speicher liegen letztlich Bits. Interessant ist dabei: Mehrere Namen können auf dasselbe Objekt zeigen.
Beispiel: Wir weisen 25 den Variablen x und z zu. Im Arbeitsspeicher könnte das wie in Abb. 3.8 gezeigt aussehen.
Abb. 3.8 Initialisierung und Zuweisung der Variablen x und z mit dem Wert 25. Die Adresse beider Variablen ist identisch.#
Identität
Das obige Beispiel zeigt Identität: mehrere Namen können auf dasselbe Objekt verweisen (gleiche Identität). Es kann aber auch sein, dass der Wert gleich ist, aber in zwei verschiedenen Objekten gespeichert ist - dann spricht man von Gleichheit.
==prüft (typischerweise) Wert/Gleichheit.isprüft Identität („ist es wirklich dasselbe Objekt?“).
a = [1, 2, 3]
b = a
c = [1, 2, 3]
print(a == b, a is b) # gleicher Inhalt, gleiche Identität
print(a == c, a is c) # gleicher Inhalt, aber andere Identität
True True
True False
Typ
Nachdem wir gesehen haben, wie Werte im Arbeitsspeicher abgelegt werden, betrachten wir nun die Typinformation. Grundidee: Auch der Typ muss irgendwo repräsentiert sein – er ist Teil der Daten, mit denen das Laufzeitsystem arbeitet. Wie genau das im Speicher aussieht, kann je nach Datentyp und Implementierung variieren, aber „Typ“ entsteht nicht automatisch, sondern muss mitverwaltet werden.
Abb. 3.9 Speicheranordnung von Werten verschiedener Datentypen.#
Klarstellung
Namen (Variablen) referenzieren Objekte (Binding), Python ist nicht „Variablen = Speicherzellen“.
Mit
isprüfen Sie Identität (dasselbe Objekt), mit==Gleichheit (gleicher Wert).