2016-08-16 3 views
-1

Ich entschuldige mich im Voraus, wenn meine Erklärung nicht kohärent genug ist. Ich bin neu in Python und Codierung. Ich versuche gerade, ein Pokemon-Programm zu erstellen, das es zwei Benutzern erlaubt, gegeneinander anzutreten. moveList ist eine globale Liste, die alle möglichen Züge im Spiel enthält. x - ist eine Datei, die speichert, welche Indizes entsprechen, welche Pokemon bewegt. pokeData.loadMoves lädt ein bereits existierendes Move-Array innerhalb jedes Pokemon mit 4 move Objekten. Wenn ich zuerst die 4 Züge von Arcanine hinzufüge, ist das in Ordnung. Wenn ich jedoch eevees Züge hinzufüge, schreibt es Arcanines Züge um. Ich habe ungefähr 40 Minuten damit verbracht, dies schon vergebens zu beheben.Python: Ändern der Daten eines Objekts ändert die anderen

separate Objekte:

P1 = None 
P2 = None 

loadGame() 

P1 = inputPokemon('player1') 
P2 = inputPokemon('player2') 

Funktion:

for x in file.readlines(): 
    x = x.split(' ') 
    if(x[0].strip().lower() == string): 

     i =int(x[1])-1 
     j =int(x[2])-1 
     k =int(x[3])-1 
     l =int(x[4])-1 

     if(second == True): 
      print("Arcanine's moves before loading eevee") 
      for x in range(4): 
       print(P1.move[x].name) 

     pokeData.loadMoves(moveList[i],moveList[j],moveList[k],moveList[l]) 
     print("Load %s's moves " %x) 

     if(second == True): 
      print("Arcanine's moves after loading eevee") 
      for x in range(4): 
       print(P1.move[x].name) 

loadMoves:

move=['','','',''] 
def loadMoves(self, move1, move2, move3, move4): 
    self.move[0] = move1 
    self.move[1] = move2 
    self.move[2] = move3 
    self.move[3] = move4 

Output:

player2, please choose your Pokemon: Eevee 
Loading moves for eevee 
Arcanine's moves before loading eevee 
['takedown'] 
['growl'] 
['flamethrower'] 
['confuseray'] 
Load 3's moves 
Arcanine's moves after loading eevee 
['watergun'] 
['doubleteam'] 
['shockwave'] 
['tackle'] 
+2

Die beiden Variablen sind am ehesten Bezugnahme auf das gleiche Objekt –

+0

Ich habe bereits versucht, zu überprüfen, ob (pokeDataArg P1) für die zweite Dateneingabe und gibt false zurück –

+0

Was ist pokeData und was ist die 'Funktion', für die Sie Code zur Verfügung gestellt haben? – sepulchered

Antwort

0

Der Übeltäter ist die Klassenvariable move. Wenn Sie diese Liste als Klassenvariable einrichten, werden alle Instanzen auf dasselbe Listenobjekt verweisen. Beachten Sie Folgendes:

>>> class T: 
... move = [] # move defined as class variable 
... def update(self, v): 
...  self.move[0:] = v 
... 
>>> c = T() 
>>> c.move 
[] 
>>> d = T() 
>>> d.update([1,2,3]) 
>>> c.move 
[1, 2, 3] # updates in d are seen in c 
>>> c.update([4,5,6]) 
>>> d.move 
[4, 5, 6] # updates in c are equally seen in d 

Sie berücksichtigen sollten move auf der Instanz der Klasse das heißt in der __init__ der Klasse einrichten. So wird die Liste für jede Instanz gebunden und nicht an die Klasse selbst:

class T: 
    def __init__(self): 
     self.move = ['','','',''] 
+0

Vielen Dank. Das war die genaue Antwort, die ich brauchte. Ich übersprang viele Tutorials und ging direkt in den Projektmodus. Also sind alle Klassenvariablen in allen Klassen statisch? –

+0

@andrewnvu Art von. Veränderbare Objekte, so wie sie sind, verhalten sich möglicherweise nicht so wie in diesem Fall. –

Verwandte Themen