Aliasing trotz Slicing

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
alan
User
Beiträge: 81
Registriert: Dienstag 10. April 2007, 11:30

Donnerstag 12. April 2007, 16:35

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
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Donnerstag 12. April 2007, 16:46

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.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Donnerstag 12. April 2007, 16:50

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
alan
User
Beiträge: 81
Registriert: Dienstag 10. April 2007, 11:30

Donnerstag 12. April 2007, 19:22

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)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Donnerstag 12. April 2007, 20:27

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)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Antworten