Tim Tepaße: Python, Tupel, Listen und Referenzen

Beitrag lesen

Hallo Kurt,

dieses Verhalten das t[0] auf die selbe Variable wie s zu referenzieren,
würde doch bedeuten (und Sinn machen), dass es sich um Aliase handelt, d.h. eine Änderung von des Inhalts von s würde auch t[0] ändern und vice versa. mit s=2 ändere ich aber auch die id(s) und t[0] behält den alten wert...?!?

Wenn Du s auf ein neues Int-Objekt mit dem Wert 2 zeigen lässt, dann hat s eben eine neue Referenz auf ein anderes Objekt. t[0] zeigt weiterhin stabil und unveränderbar auf das originale Objekt; hat deswegen noch immer die gleiche ID:

>>> s = 1
  >>> id(s)
  16790920
  >>> t = (s, 2)
  >>> id(t[0])
  16790920
  >>> s = 2
  >>> id(s)
  16790908
  >>> id(t[0])
  16790920

Zahlen (und Strings .. und Tupel) sind in Python unveränderbar, jede Operation auf diese hat eine neue, keine geänderte Zahl und damit ein neues, anderes und kein geändertes Objekt zur Folge. Lustiger wird es, wenn man einen veränderbaren Objekt-Typ nimmt:

>>> li = [1, 2]
  >>> id(li)
  420480
  >>> t = (li, "foo")
  >>> t
  ([1, 2], 'foo')
  >>> id(t[0])
  420480
  >>> li[0] = "bar"
  >>> li
  ['bar', 2]
  >>> id(li)
  420480
  >>> t
  (['bar', 2], 'foo')
  >>> id(t[0])
  420480

Die Unveränderbarkeit des Tupels bezieht sich also auf die darin enthaltenen Referenzen, nicht auf die gesamte referenzierte Struktur selbst.

Tim