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

Code: Alles auswählen

x = list[0]
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

Code: Alles auswählen

x = list[0]
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

Code: Alles auswählen

x = list[0]
list[0] += 1
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 :)

Code: Alles auswählen

someList = ['a', 'b', ['c', ['d', 'e']]]
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)