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

Python Syntax
id(object)
Parameter
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

Python Beispiel
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 Inhalt
Output
True
True
False
True

Small-Integer-Cache (CPython)

Python Beispiel
# 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. False
Output
True
False

Identität nach Mutation bleibt erhalten

Python Beispiel
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ät
Output
True
False

Praktische Beispiele

Zyklen-Erkennung mit id-Set

Python Beispiel
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))
Output
True

Deduplizieren ohne Hash-Zwang

Python Beispiel
# 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 == a
Output
2

Praktische Hinweise

  • is-Operator nutzen statt id(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.
/ Weiter

Zurück zu Builtin Functions

Zur Übersicht