Seite 1 von 1

Klassenkonstruktor - Liste nicht überschrieben

Verfasst: Do Sep 01, 2011 4:54 pm
von fat-lobyte
Hallo und Entschuldigung für den nichtssagenden Titel, bin nur gerade ein Bisschen verwirrt.

Ich wollte in einer Schleife ein Objekt anlegen, ein paar Einträge an eine Liste anhängen und das Objekt dann per yield zurückgeben. Ungefär so:

Code: Alles auswählen

#!/usr/bin/python3


class MyClass:
    def __init__(self, mylist=[]):
        self.mylist = mylist


for i in range(5):
    obj = MyClass()
    print("obj.mylist:", obj.mylist)
    obj.mylist.append(i)
    # yield obj
Komm aber drauf: die liste wird immer Länger!!

Code: Alles auswählen

$ python3 testloop.py 
obj.mylist: []
obj.mylist: [0]
obj.mylist: [0, 1]
obj.mylist: [0, 1, 2]
obj.mylist: [0, 1, 2, 3]
Also mein Grundgedanke war, dass das Objekt in jedem Durchlauf überschrieben wird und so nur eine zahl enthalten sollte. Dem ist offensichtlich nicht so.

Ein workaroud ist übrigens bei der Konstruktion explizit eine leere Liste zu übergeben: obj = MyClass(mylist=[]).
Ich würde trotzdem gerne verstehen was hier passiert.
Hat jemand eine Idee??

Gleiches Verhalten mit 3.1.3 und 2.6.6

Re: Klassenkonstruktor - Liste nicht überschrieben

Verfasst: Do Sep 01, 2011 5:18 pm
von nufan
http://docs.python.org/reference/compou ... l#function
Default parameter values are evaluated when the function definition is executed.
Du bekommst also immer die gleiche Liste übergeben. Wie das Problem zu lösen ist findest du ebenfalls auf der verlinkten Seite.

Re: Klassenkonstruktor - Liste nicht überschrieben

Verfasst: Do Sep 01, 2011 5:24 pm
von fat-lobyte
dani93 hat geschrieben:http://docs.python.org/reference/compou ... l#function
Default parameter values are evaluated when the function definition is executed.
Du bekommst also immer die gleiche Liste übergeben. Wie das Problem zu lösen ist findest du ebenfalls auf der verlinkten Seite.
Ok, macht Sinn, danke. Ein wenig seltsam find ichs trotzdem.