2016-08-16 2 views
-1

私の説明が十分にコヒーレントでない場合は、事前にお詫びします。私はPythonとコーディングに新しいです。私は現在、2人のユーザーが互いに戦うことを可能にするポケモンプログラムを作成しようとしています。 moveListは、ゲーム内のすべての可能な移動を含むグローバルリストです。 x - どのインデックスがどのポケモンの動きに対応するかを格納するファイルです。 pokeData.loadMovesは、各ポケモンの内部に4 moveオブジェクトを持つ既存の移動配列をロードします。私が最初にArcanineの4つの動きを加えると、それは問題ありません。しかし、私がeeveeの動きを加えると、Arcanineの動きに書き換えられます。私はすでに約40分を費やしてこれを補うことは無駄にしています。Python:1つのオブジェクトのデータを変更すると、他のオブジェクトが変更されます

別のオブジェクト:

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

2つの変数が最も可能性が高い同じオブジェクト –

+0

を参照している(pokeDataArgがP1である)場合、私はすでにチェックしようとした第2のデータ入力のためにfalseを返します –

+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 

あなたはクラスの__init__に、すなわちクラスのインスタンスにmoveの設定を検討すべきです。だから、リストは各インスタンスにしていないクラス自体にバインドされています

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

どうもありがとうございました。これは私が必要とした正確な答えでした。私は多くのチュートリアルをスキップし、プロジェクトモードに直進しました。したがって、すべてのクラス変数はクラス間で静的ですか? –

+0

@andrewnvu並べ替えそのため、これらのオブジェクトは、この場合のように意図したとおりに動作しない可能性があります。 –

関連する問題