Variablen/Objekte im Speicher. Referenzen? Häh?

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
Panke
User
Beiträge: 185
Registriert: Sonntag 18. März 2007, 19:26

Mittwoch 28. März 2007, 11:45

Hallo,

erstmal möchte ich mich für den vielleicht undeutlichen Titel entschuldigen, aber ich fange gerade an mich mit Python zu beschäftigen und stehe gerade ziemlich auf dem Schlauch, was folgendes Phänomen angeht:

Code: Alles auswählen

class foo(object):
    a = 5

instanz = foo()
#hier ist jetzt instanz.a = 5
instanz2 = instanz
instanz2.a = 6
#hier ist instanz.a auf einmal 6

#Aber!

a = 5
b = a
b = 6
#hier ist a noch 5 und b ist 6
Wann weiß ich denn jetzt, ob eine Zuweisung noch eine andere Variable verändert? Wie unterscheide ich hier die Referenzen (instanz ist doch ne Referenz, oder?) von den "richtigen" Variablen?

Panke
BlackJack

Mittwoch 28. März 2007, 11:59

Was sind "richtige" Variablen? In Python solltest Du in Namen und Objekten denken und die Namen werden an Objekte gebunden.

Wenn Du ``instanz2 = instanz`` schreibst, dann wird der Name `instanz2` an das selbe Objekt gebunden an das auch `instanz` gebunden ist. Du hast zwei verschiedene Namen für das gleiche Objekt. Daraus folgt das ein ``instanz2.a = 6`` dem selben Objekt das auch unter dem Namen `instanz` bekannt ist, eine Bindung zwischen dem Namen `a` und dem Objekt ``6`` verpasst.

Bei den Zahlzuweisungen passiert im Grunde genau das gleiche. Erst bindest Du `a` an das Objekt ``5``, dann `b` an das gleiche Objekt und danach dann `b` an ein völlig anderes Objekt ``6``. Das hat keinen Einfluss auf die Bindung von `a` an das Objekt ``5``.

Du versuchst eine Unterscheidung zu machen die es nicht gibt. In Python ist alles Objekt und die Bindung funktioniert immer gleich.

``a = foo()`` verhält sich nicht anders als ``a = 5``. Beide Anweisungen binden den Namen `a` an ein Objekt.
Panke
User
Beiträge: 185
Registriert: Sonntag 18. März 2007, 19:26

Mittwoch 28. März 2007, 12:05

Ah, Okay. Mein Fehler war zu glauben, dass a,b auf ein Objekt mit dem Wert 5 zeigen und ich dann den Wert des Objektes ändere. So ist das klar. Danke.
Corni
User
Beiträge: 4
Registriert: Donnerstag 29. März 2007, 09:51

Donnerstag 29. März 2007, 10:25

Spielt hier der Begriff "immutable" nicht eine wichtige Rolle.
int, float, str, tupel sind unveränderlich/ immutable, d.h. wenn ich eine Änderung vornehme wird an einer neuen Stelle im Speicher ein neues Objekt geschrieben. Referenziert keine weitere Variable das alte Objekt, ist kein Zugriff mehr möglich. Eigene Datentypen oder Listen sind dynamisch, weswegen bei Änderung ein Wert überschrieben werden kann, jedoch kein neues Objekt angelegt wird.

Code: Alles auswählen

>>> x = [1,2,3]
>>> id(x)
-1479591156
>>> x[0] = 4
>>> id(x)
-1479591156
Tupel kennen weder Indexierung noch y.append(z).
BlackJack

Donnerstag 29. März 2007, 10:43

Nein "immutable" spielt eigentlich keine grosse Rolle. Die Bindungen sind immer gleich. Ob man den Zustand eines Objekts verändern kann oder nicht, hat keinen Einfluss auf die Bindung zwischen Name und Objekt.

Mit einer Indexzuweisung bindet man nicht den Namen neu, sondern etwas im Objekt an den der Name gebunden ist. Bzw. ist es im Grunde ein Methodenaufruf von `__setitem__()`.
Antworten