2016-04-21 10 views
1

Ich stieß auf ein ziemlich seltsames Problem mit Python-Liste anfügen heute. Ich habe versucht, ein Array zu erstellen, dessen jedes Element wie ein C struct wäre. Eines dieser Elemente war eine eigene Liste. Dies ist der problematische Code:Python-Liste anhängendes Problem

class players: 
    name='placeholder' 
    squad=list() 

teams=list() 
teams.append(players()) 
teams.append(players()) 
teams[0].name="abc" 
teams[1].name="xyz" 
teams[0].squad.append("Joe") 

for w in teams: 
    print(w.name) 
    print(w.squad) 

Der Ausgang I erwartet ist:

abc 
['Joe'] 
xyz 
[] 

Da ich nur ein Mitglied zu squad für Teams [0] hinzugefügt. Aber der Ausgang ich erhalte, ist:

abc 
['Joe'] 
xyz 
['Joe'] 

Der Name wird in Ordnung, aber die .append angehängt an beiden Elemente teams!

Was verursacht dies und wie kann ich das umgehen?

Antwort

11

Der Grund dafür ist, dass in Ihrer Klassendefinition und name Klassenvariablen sind, keine Instanzvariablen. Wenn ein neues Objekt player initialisiert wird, teilt es im Wesentlichen die gleiche Variable über alle Instanzen des Players. Stattdessen möchten Sie eine __init__-Methode für die Klasse player definieren, die die instanzspezifischen Variablen explizit trennt.

class players: 
    def __init__(self): 
     self.name = 'placeholder' 
     self.squad = [] 

Dann, wenn Sie Ihr neues player Objekt initialisieren, hat es seine eigene squad variabel. Der Rest Ihres Codes sollte jetzt gut funktionieren, wobei nur das korrekte Objekt angehängt wird.

+0

Danke! Dies löst das Problem! –