Seite 1 von 1
Aliasing trotz Slicing
Verfasst: Donnerstag 12. April 2007, 16:35
von alan
Hallo allerseits
ich knobele schon eine ganze Weile daran rum: Wie kann ich erreichen, dass
keine Kopie von
list[0] erstellt, sondern nur auf
list[0] verweist? d.h. wenn man den Wert von
list[0] um 1 erhöht, erhöht sich auch
x um eins.
Freue mich über jede Hilfe
Verfasst: Donnerstag 12. April 2007, 16:46
von EyDu
Bei einer Zuweisung wird immer nur die Referenz übergeben und niemals eine Kopie angelegt:
Code: Alles auswählen
>>> l = [0,1,2]
>>> x = l[0]
>>> id(l[0])
9786892
>>> id(x)
9786892
Schau dir am besten noch mal den Unterschied zwischen "mutable" und "unmutable" an, da liegt nämlich dein Problem.
Übrigens: es ist nicht gerade sinnvoll ein Objekt an den Namen "list" zu binden.
Re: Aliasing trotz Slicing
Verfasst: Donnerstag 12. April 2007, 16:50
von birkenfeld
alan hat geschrieben:Hallo allerseits
ich knobele schon eine ganze Weile daran rum: Wie kann ich erreichen, dass
keine Kopie von
list[0] erstellt, sondern nur auf
list[0] verweist? d.h. wenn man den Wert von
list[0] um 1 erhöht, erhöht sich auch
x um eins.
Das Problem ist, dass sich der Wert des Objektes "list[0]" nicht um 1 erhöhen kann (ich gehe mal davon aus, dass es sich um einen int handelt). Das hier
weist nämlich `list[0]` ein *neues* Objekt zu. Das alte Integerobjekt, das jetzt nur noch an `x` gebunden ist, weiß davon nichts.
Verfasst: Donnerstag 12. April 2007, 19:22
von alan
Hm ok, seh ich ein. Das würde sonst ja auf Pointer hinauslaufen, und die will man wohl nicht ganz zu unrecht nicht?
Hätte noch eine Frage, will aber keinen neuen Thread erstellen
Wie kann ich da auf die "am tiefsten verschachtelste Liste" ['d', 'e'] zugreifen (z.b. mit append() ), wenn
someList dynamisch erstellt wurde? (die Anzahl der 'Verschachtelungen' (hier 2) ist allerdings gegeben)
Verfasst: Donnerstag 12. April 2007, 20:27
von birkenfeld
Wenn du immer die erste Unterliste hernehmen willst, so:
Code: Alles auswählen
def nested(liste, tiefe):
for item in liste:
if isinstance(item, list):
if tiefe == 1: return item
else: return nested(item, tiefe-1)
nested(liste, 2)