Seite 1 von 1

dictionary ändert seinen Wert

Verfasst: Freitag 1. Juli 2016, 17:58
von heyho88
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}

Re: dictionary ändert seinen Wert

Verfasst: Freitag 1. Juli 2016, 18:58
von /me
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.

Re: dictionary ändert seinen Wert

Verfasst: Sonntag 3. Juli 2016, 20:28
von heyho88
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

Re: dictionary ändert seinen Wert

Verfasst: Sonntag 3. Juli 2016, 20:57
von Sirius3
@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.

Re: dictionary ändert seinen Wert

Verfasst: Sonntag 3. Juli 2016, 21:55
von heyho88
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

Re: dictionary ändert seinen Wert

Verfasst: Sonntag 3. Juli 2016, 22:06
von Sirius3
@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}

Re: dictionary ändert seinen Wert

Verfasst: Dienstag 5. Juli 2016, 12:59
von heyho88
Hey Sirius,

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


Viele Grüße
Peter

Re: dictionary ändert seinen Wert

Verfasst: Dienstag 5. Juli 2016, 13:15
von /me
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.