Seite 1 von 1

Klassen und Instanzen

Verfasst: Samstag 14. Dezember 2019, 10:43
von un1e4shed
Hallo Zusammen,
ich nutze Python 3.6 und habe ein Problem mit meiner Klasse.
Mein Code:

Code: Alles auswählen

class TestKlasse:

    def __init__(self, storage=[]):
        self.storage = storage     
            
    def run(self):        
        self.storage.append(1)        
        print(self.storage)

if __name__ == '__main__':        
    t = TestKlasse()
    t.run()  
    
    r = TestKlasse()
    r.run()    
    
    x = TestKlasse()
    x.run()
    
Mein Ergebnis:

Code: Alles auswählen

[1]
[1, 1]
[1, 1, 1]
Was ich aber eigentlich für ein Ergebnis erwarte:

Code: Alles auswählen

[1]
[1]
[1]
Wo habe ich hier den Denkfehler?
Ich erzeuge doch 3 seperate Objekte in verschiedenen Instanzen....

Danke vorab

Re: Klassen und Instanzen

Verfasst: Samstag 14. Dezember 2019, 10:58
von nezzcarth
un1e4shed hat geschrieben: Samstag 14. Dezember 2019, 10:43 Wo habe ich hier den Denkfehler?
Ich erzeuge doch 3 seperate Objekte in verschiedenen Instanzen....
Der "Denkfehler" hängt wahrscheinlich damit zusammen, dass es wohl nicht ganz intuitiv ist, wie sich veränderliche Datentypen (mutables) verhalten, wenn sie als Default-Argumente verwendet werden. Eine Erklärung findest du z.B. hier: https://docs.python-guide.org/writing/g ... -arguments

Kurz gesagt: Es handelt sich immer um dasselbe Listenobjekt, was damit zusammenhängt, wann und wie oft (nämlich nur einmal) Python die Argumente verarbeitet. Wenn du in der Methode run so etwas wie 'print(id(self.storage))' schreibst, kannst du sichtbar machen, dass es nicht drei verschiedene Listen sind, sondern immer dieselbe.

Besser wäre in deinem Fall so etwas:

Code: Alles auswählen

    def __init__(self, storage=None):
        self.storage = [] if storage is None else storage

Re: Klassen und Instanzen

Verfasst: Samstag 14. Dezember 2019, 15:23
von un1e4shed
Alles klar, danke!