Seite 1 von 1
Verständnisproblem - Referenz auf Speicher
Verfasst: Freitag 27. Januar 2017, 10:38
von schrodi
Hallo zusammen.
Ich habe noch ein allgemeines Verständnisproblem bzgl. der Referenz den Speicher.
Folgendes Szenario:
Ich habe ein Objekt und fülle eine Liste mit einem Attribut des Objektes.
Nach List.append ändere ich das Attribut des Objektes. Das Attribut in der Liste ändert sich jedoch nicht. Ich dachte, dies wäre ein Bezug auf den Speicher des Objektattributes. Dem ist scheinbar aber nicht so?!
Einfaches Bsp.
Code: Alles auswählen
class obj(object):
name="Name"
Objekt = obj()
Liste = list()
Liste.append(Objekt.name)
print l[0] # = Name
Objekt.name="changedName"
print l[0] # = Name
Könnt ihr mir das Verhalten erklären?
P.S.
Wenn ich das gesamte Objekt der Liste hinzufüge und via << l[0].name >> wieder auslese wird das nachträgliche Verändern des Wertes auch an die Liste weitergegeben.
Gruß
André
Re: Verständnisproblem - Referenz auf Speicher
Verfasst: Freitag 27. Januar 2017, 10:52
von Sirius3
@schrodi: Deine erste Annahme ist schon falsch. Du füllst die Liste nicht mit einem Attribut sondern mit dem String, auf das das Attribut verweist. Der String existiert unabhängig davon, ob es an ein Attribut oder irgendetwas anderes gebunden ist.
Re: Verständnisproblem - Referenz auf Speicher
Verfasst: Freitag 27. Januar 2017, 13:17
von schrodi
Ok.
Das bedeutet, dass das Attribut von Objekt schon ein Verweis ist.
Wenn ich jetzt schreibe:
Wird dann der Ursprungstring unter selbem Speicher verändert, oder wird ein neuer String angelegt und der Verweis von .name auf den neuen String/Speicher gesetzt?
Unabhängig davon enthält Objekt.name einen anderen Wert: entweder den neuen Sting oder den geänderten alten String.
Warum ist diese Änderung dann nicht in der Liste erkennbar?
Re: Verständnisproblem - Referenz auf Speicher
Verfasst: Freitag 27. Januar 2017, 14:18
von BlackJack
@schrodi: Zeichenketten sind in Python unveränderbar. Der Speicher und die Adresse des Speichers gehört zum *Objekt* und *nicht* zum Namen oder Attribut. In der Liste ist keine Veränderung erkennbar weil da eine unveränderbare Zeichenkette drin ist und Du die Liste nicht veränderst, also verändert sich weder an der Liste noch an dem Wert des Elements etwas.
Edit: Situation vor der Zuweisung:
[codebox=text file=Unbenannt.txt]+---------------+ +---------+
| List | --> | <list> |
+---------------+ +---------+
| |
| 0 | ------+
+---------+ |
+---------------+ |
| Objekt | |
+---------------+ |
| |
| |
v |
+---------------+ |
| <obj> | |
+---------------+ |
| | |
| __class__ | ------+ |
+---------------+ | |
| |
| |
v |
+---------------+ +---------+ |
| obj | --> | <class> | |
+---------------+ +---------+ v
| | +--------+
| name | --> | <str> |
+---------+ +--------+
+---------------+ | |
| <str> | | "Name" |
+---------------+ +--------+
| "changedName" |
+---------------+[/code]
Und nach der Zuweisung von ``Object.name = 'changedName'``:
[codebox=text file=Unbenannt.txt] +-----------+ +---------+
| List | --> | <list> |
+-----------+ +---------+
| |
| 0 | ------+
+---------+ |
+-----------+ |
| Objekt | |
+-----------+ |
| |
| |
v |
+-----------+ |
| <obj> | |
+-----------+ |
| | |
| __class__ | ------+ |
+-----------+ | |
+---------------+ | | | |
| <str> | <-- | name | | |
+---------------+ +-----------+ | |
| | | |
| "changedName" | | |
+---------------+ v |
+-----------+ +---------+ |
| obj | --> | <class> | |
+-----------+ +---------+ v
| | +--------+
| name | --> | <str> |
+---------+ +--------+
| "Name" |
+--------+[/code]