2016-08-16 2 views
-1

Я извиняюсь раньше времени, если мое объяснение недостаточно когерентное. Я новичок в python и кодировании. В настоящее время я пытаюсь создать программу Pokemon, которая позволит двум пользователям сражаться друг с другом. moveList - это глобальный список, содержащий все возможные ходы в игре. x - это файл, в котором индексы соответствуют ходу покемонов. pokeData.loadMoves загружает существующий массив перемещения внутри каждого покемона с объектами 4 move. Когда я впервые добавляю 4 шага Арканана, все в порядке. Однако, когда я добавляю движения eevee, он переписывает шаги Арканана. Я потратил около 40 минут, пытаясь исправить это безрезультатно.Python: изменения данных одного объекта меняют другой

отдельные объекты:

P1 = None 
P2 = None 

loadGame() 

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

функции:

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 

Выход:

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

две переменные, скорее всего, ссылки на один и тот же объект –

+0

я уже пытался проверить, если (pokeDataArg является P1) для второго ввода данных и возвращает ложь –

+0

Что такое pokeData и что такое 'function', для которого вы предоставили код? – sepulchered

ответ

0

Преступником является переменная класса move. Настройка этого списка как переменной класса означает, что все экземпляры будут указывать на один и тот же объект списка. Рассмотрим следующий пример:

>>> 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 

Вы должны рассмотреть вопрос о создании move на экземпляре класса то есть в __init__ класса. Таким образом, список привязан к каждому экземпляру, а не к самому классу:

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

Большое спасибо. Это был точный ответ, который мне нужен. Я пропустил много уроков и пошел прямо в режим проекта. Итак, все переменные класса статичны по классам? –

+0

@andrewnvu Сортировка. Таким образом, изменяемые объекты, являющиеся тем, чем они являются, могут вести себя не так, как предполагалось, в этом случае. –

Смежные вопросы