dictionary ändert seinen Wert

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
heyho88
User
Beiträge: 4
Registriert: Freitag 1. Juli 2016, 17:52

Hallo ihr Lieben,

ich bin noch recht neu bei Python und komme grade bei einem Problem überhaupt nicht weiter : ( Kann mir vielleicht jemand von euch weiterhelfen? : )

Der Code unten und dessen Output ist recht überschaubar, was ich nicht verstehe und meiner Meinung nach nicht sein dürfte ist, dass bei der zweiten print-Schleife die "list1.dict1"-Variable nicht mehr die Werte hat, die sie beim der ersten print-Schleife hatte.

Jemand vielleicht eine Idee?


Vielen herzlichen Dank für die Mühen : )


Viele Grüße
Peter





Code: Alles auswählen

class ClassTest:
    dict1 = {}

    def __init__(self, var1, var2):
        self.var1 = var1
        self.dict1["SUBVAR3"] = var2

list1 = []

for i in range(0, 5):

    var = i

    list1.append(ClassTest(var, var))

    print("VAR1: ", list1[i].var1, "VAR2:", list1[i].dict1)

for i in range(0, 5):
    print("VAR1: ", list1[i].var1, "VAR2:", list1[i].dict1)


Output:

Code: Alles auswählen

VAR1:  0 VAR2: {'SUBVAR3': 0}
VAR1:  1 VAR2: {'SUBVAR3': 1}
VAR1:  2 VAR2: {'SUBVAR3': 2}
VAR1:  3 VAR2: {'SUBVAR3': 3}
VAR1:  4 VAR2: {'SUBVAR3': 4}

VAR1:  0 VAR2: {'SUBVAR3': 4}
VAR1:  1 VAR2: {'SUBVAR3': 4}
VAR1:  2 VAR2: {'SUBVAR3': 4}
VAR1:  3 VAR2: {'SUBVAR3': 4}
VAR1:  4 VAR2: {'SUBVAR3': 4}
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Du erstellst dein Dictionary als Klassenvariable. Damit ist der Inhalt für alle von dieser Klasse erzeugten Instanzen gleich. Erstelle das Dictionary in der __init__-Methode damit es für jede Instanz der Klasse individuell ist.
heyho88
User
Beiträge: 4
Registriert: Freitag 1. Juli 2016, 17:52

Hallo me,

vielen Dank für deine schnelle Antwort: )


Leider verstehe ich deine Antwort nicht, ich erstelle doch die Dictionaryvariable in der __init__-Methode, und das Problem tritt trotzdem auf : (

Weißt du vielleicht woran das liegt?


Viele Grüße
Peter
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@heyho88: Du füllst das Klassenattribut »dict1« in der __init__, erstellt wird das Attribut aber bei der Definition der Klasse (daher auch Klassenattribut). Daher haben alle Instanzen das selbe Wörterbuch, das in __init__ nur immer wieder mit anderen Werten gefüllt wird.
heyho88
User
Beiträge: 4
Registriert: Freitag 1. Juli 2016, 17:52

Hallo Sirius,

vielen Dank für deine Antwort : ) Ich verstehe langsam woran das Problem liegt, aber ich verstehe leider immer ich nicht, wo ich die Dictionaryvariable definieren muss damit die für jede Klasse individuell ist : (

Kann ich dich bitten mir an meinem Beispiel zu zeigen, wo es hinmuss?


Vielen Dank im Voraus!


Viele Grüße
Peter
Sirius3
User
Beiträge: 17746
Registriert: Sonntag 21. Oktober 2012, 17:20

@heyho88: so wie Du var1 auch schon erzeugst:

Code: Alles auswählen

class ClassTest:
    def __init__(self, var1, var2):
        self.var1 = var1
        self.dict1 = {"SUBVAR3": var2}
heyho88
User
Beiträge: 4
Registriert: Freitag 1. Juli 2016, 17:52

Hey Sirius,

vielen vielen Dank! - Jetzt habe ich es verstanden : )


Viele Grüße
Peter
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Was man sich klarmachen muss: Mit einer Zuordnung von Werten (self.dict1['key'] = value) erstellt man kein neues Dictionary. Es wird nur der Inhalt eines bestehenden Dictionaries geändert. Gleiches gilt beispielsweise für Listen.

Auch wichtig: Bei einer Zuweisung entsteht keine Kopie. Die Daten erhalten nur einen zusätzlichen Namen.

Code: Alles auswählen

>>> a = [0]
>>> b = a
>>> b.append(1)
>>> b
[0, 1]
>>> a
[0, 1]
a und b sind hier durch die Zuweisung unterschiedliche Namen für die gleiche Liste. Will man eine Kopie, so muss man sie explizit erzeugen.
Antworten