Die Python-Funktion id(obj) liefert eine eindeutige Ganzzahl-Identität für das übergebene Objekt — garantiert konstant über die gesamte Lebenszeit dieses Objekts. Zwei Objekte mit derselben id() sind das identische Objekt im Speicher (a is b). In CPython entspricht der Rückgabewert in der Regel der Speicheradresse des Objekts.
Einleitung
Python unterscheidet zwischen Gleichheit (==, prüft Inhalts-Gleichheit) und Identität (is, prüft, ob es dasselbe Objekt im Speicher ist). id() macht den Identitäts-Begriff sichtbar: Solange zwei Variablen denselben id()-Wert liefern, zeigen sie auf exakt dasselbe Objekt.
In CPython (der Referenz-Implementierung) wird die Identität aus der Speicheradresse abgeleitet, in PyPy oder Jython sind die Werte abstrakter, aber das Garantie-Versprechen bleibt: pro Objekt eindeutig zur Lebenszeit. Sobald ein Objekt vom Garbage Collector eingesammelt wird, kann seine id() für ein neues Objekt wiederverwendet werden — ein wichtiges Detail, das man in id()-basierten Caches beachten muss.
id() ist primär ein Werkzeug zum Debugging und Verständnis — produktiver Code sollte selten direkt darauf zugreifen.
Syntax
id(object)object Beliebiges Python-Objekt.
Rückgabewert
Eine int-Identität, die das Objekt für die Dauer seiner Existenz eindeutig identifiziert.
Beispiele
Identität von Variablen vergleichen
a = [1, 2, 3]
b = a
c = [1, 2, 3]
print(id(a) == id(b)) # gleiche Identität
print(a is b)
print(id(a) == id(c)) # unterschiedliche Objekte
print(a == c) # aber gleicher InhaltTrue
True
False
TrueSmall-Integer-Cache (CPython)
# CPython cacht kleine Integer (-5 bis 256)
x = 100
y = 100
print(id(x) == id(y)) # True — gecacht
# Größere Zahlen sind nicht gecacht
x = 10_000
y = 10_000
print(id(x) == id(y)) # ggf. FalseTrue
FalseIdentität nach Mutation bleibt erhalten
items = [1, 2, 3]
original_id = id(items)
items.append(4)
print(id(items) == original_id) # mutable: gleiche Identität
s = "Hallo"
original_id = id(s)
s += " Welt"
print(id(s) == original_id) # immutable: neue IdentitätTrue
FalsePraktische Beispiele
Zyklen-Erkennung mit id-Set
def has_cycle(start):
visited = set()
current = start
while current is not None:
if id(current) in visited:
return True
visited.add(id(current))
current = getattr(current, "next", None)
return False
class Node:
def __init__(self, val):
self.val = val
self.next = None
a = Node(1); b = Node(2); c = Node(3)
a.next = b; b.next = c; c.next = a # Zyklus
print(has_cycle(a))TrueDeduplizieren ohne Hash-Zwang
# Listen sind nicht hashable — set() würde TypeError werfen.
# Identitäts-basierte Deduplizierung umgeht das:
a = [1, 2]
b = [1, 2]
c = a
objects = [a, b, c, a]
unique = []
gesehen = set()
for o in objects:
if id(o) not in gesehen:
gesehen.add(id(o))
unique.append(o)
print(len(unique)) # nur a und b zählen, c == a2Praktische Hinweise
is-Operator nutzen stattid(a) == id(b)— sauberer und idiomatisch.- Garbage-Collection-Falle: nach Freigabe kann eine ID wiederverwendet werden. ID-basierte Caches halten daher meist auch eine Referenz auf das Objekt, um GC zu verhindern.
- CPython-Detail:
id()ist die Speicheradresse — andere Implementierungen können andere Werte liefern. - Debug-Tipp:
print(f"{obj!r} @ {id(obj):#x}")zeigt Repräsentation und Hex-Adresse.