Verständnisproblem - Referenz auf Speicher

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
schrodi
User
Beiträge: 16
Registriert: Dienstag 10. Mai 2016, 12:59

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é
Zuletzt geändert von schrodi am Freitag 27. Januar 2017, 10:57, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
schrodi
User
Beiträge: 16
Registriert: Dienstag 10. Mai 2016, 12:59

Ok.
Das bedeutet, dass das Attribut von Objekt schon ein Verweis ist.

Wenn ich jetzt schreibe:

Code: Alles auswählen

Objekt.name = "irgendwas"
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?
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]
Antworten