Klassen und Instanzen

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
un1e4shed
User
Beiträge: 3
Registriert: Sonntag 22. April 2018, 08:45

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
nezzcarth
User
Beiträge: 1764
Registriert: Samstag 16. April 2011, 12:47

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
un1e4shed
User
Beiträge: 3
Registriert: Sonntag 22. April 2018, 08:45

Alles klar, danke!
Antworten