2015-05-20 7 views
5

Ich habe die folgende Klasse, die eine Brust darstellt, in dem Spielzeug (Zahlen) gespeichert werden können:In einer Schleife in Python, ich eine neue Instanz einer Klasse der gleichen Variablen zuweisen, aber es zeigt auf die alte Instanz?

class Chest: 

    toys = [] 

    def __init__(self): 
    return 

    def add(self, num): 
    self.toys.append(num) 
    return 

Der Hauptcode, der diese Klasse verwendet, ist wie folgt: Also, für jede Iteration

room_of_chests = [] 

for i in range(3): 

    print "Chest", i 
    temp = Chest() 

    print "Number of toys in the chest:", len(temp.toys) 

    for j in range(5): 
    temp.add(j) 

    print "Number of toys in the chest:", len(temp.toys) 
    print "" 

    room_of_chests.append(temp) 

von mir, ich erstelle eine neue Brust und machen die Variable temp zeigen Sie darauf (richtig?). Also, in der Theorie würde Temp in jeder Iteration mit einer leeren Truhe beginnen und mit einer Truhe mit 5 Spielzeugen enden (richtig?).

Daher ist die Ausgabe ich erwarte ist:

Chest 0 
Number of toys in the chest: 0 
Number of toys in the chest: 5 

Chest 1 
Number of toys in the chest: 0 
Number of toys in the chest: 5 

Chest 2 
Number of toys in the chest: 0 
Number of toys in the chest: 5 

Aber was ich eigentlich bin immer ist:

Chest 0 
Number of toys in the chest: 0 
Number of toys in the chest: 5 

Chest 1 
Number of toys in the chest: 5 
Number of toys in the chest: 10 

Chest 2 
Number of toys in the chest: 10 
Number of toys in the chest: 15 

Was mache ich falsch? Kann jemand eine kurze Erklärung geben, wie Instanziierung in diesem Fall funktioniert? Und die Regeln von Variablen, die auf Objekte in Python zeigen? Danke im Voraus.

Antwort

10

Das Problem ist, dass Sie ein Klassenattribut und keine Instanzvariable haben. Ändern Sie Ihre Klasse in eine Instanzvariable, indem Sie sie in der Funktion __init__ als Mitglied von self erstellen.

Außerdem muss return in __init__ nicht verwendet werden.

class Chest: 

    def __init__(self): 
    self.toys = [] 


    def add(self, num): 
    self.toys.append(num) 

Dies ist ein häufiger Fehler, wenn Sie aus einer Sprache wie Java oder C++ kommen.

+1

Python-Klassenattribute sind nicht ganz dieselben wie statische oder statische Java-Membervariablen. Die Python-Dokumente sind sehr darauf bedacht, den Begriff "statische Variable" oder "statisches Attribut" nirgendwo zu verwenden, um zu vermeiden, dass irgendetwas impliziert wird, was nicht wahr ist, und es wäre besser, hier dasselbe zu tun. (Sonst tolle Erklärung.) – abarnert

+0

@abarnert, Danke für den Kommentar. Ich werde die Terminologie aktualisieren. – merlin2011

+0

Oh, auch "__init__" ist der Initialisierer; Der Konstruktor (über den man sich selten Sorgen machen muss) ist '__new__'. – abarnert