Klassenkonstruktor - Liste nicht überschrieben

Objektorientierte Skriptsprache: (python.org)
Antworten
Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Klassenkonstruktor - Liste nicht überschrieben

Beitrag von fat-lobyte » Do Sep 01, 2011 4:54 pm

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

nufan
Wiki-Moderator
Beiträge: 2557
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Klassenkonstruktor - Liste nicht überschrieben

Beitrag von nufan » Do Sep 01, 2011 5:18 pm

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.

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: Klassenkonstruktor - Liste nicht überschrieben

Beitrag von fat-lobyte » Do Sep 01, 2011 5:24 pm

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.
Haters gonna hate, potatoes gonna potate.

Antworten