2016-05-14 19 views
2

私の知識をPythonでさらに進める試みとして、私は非常に単純なティックタックのAIを作成し始めました。リスト内から参照されるPythonクラスの変数

現在、私は、ローカルリストにクラスインスタンス変数を追加し、ローカルリスト内の項目を変更すると、インスタンス変数も変更されていると私は予想していないいくつかの動作に困惑しています。

クラスインスタンス変数に影響を与えずにローカルリスト要素のみを変更するにはどうすればよいですか?

これが影響を受けているプログラムの抜粋です:しかし

[[2, 0, 0], [0, 1, 0], [0, 0, 0]] 
[[2, 2, 0], [0, 1, 0], [0, 0, 0]] 
[[2, 2, 2], [0, 1, 0], [0, 0, 0]] 
[[2, 2, 2], [2, 1, 0], [0, 0, 0]] 
[[2, 2, 2], [2, 1, 2], [0, 0, 0]] 
[[2, 2, 2], [2, 1, 2], [2, 0, 0]] 
[[2, 2, 2], [2, 1, 2], [2, 2, 0]] 
[[2, 2, 2], [2, 1, 2], [2, 2, 2]] 

それはず:

[ 
    [0, 0, 0], 
    [0, 1, 0], 
    [0, 0, 0] 
] 

これを出力:

class ticAI: 
    def __init__(self, board): 
     self.board = board 
     self.tic = tictactoe(board) 

    def calc(self): 
     possibilities = [] 
     ycord = 0 
     for y in self.board: 
      xcord = 0 
      for x in y: 
       if x == 0: 
        possibilities.append(self.board) 
        possibilities[len(possibilities)-1][ycord][xcord] = 2 
        print(self.board) 
       xcord += 1 
      ycord += 1 

self.boardは次のようになります出力する:

[[2, 0, 0], [0, 1, 0], [0, 0, 0]] 
[[0, 2, 0], [0, 1, 0], [0, 0, 0]] 
[[0, 0, 2], [0, 1, 0], [0, 0, 0]] 
[[0, 0, 0], [2, 1, 0], [0, 0, 0]] 
[[0, 0, 0], [0, 1, 2], [0, 0, 0]] 
[[0, 0, 0], [0, 1, 0], [2, 0, 0]] 
[[0, 0, 0], [0, 1, 0], [0, 2, 0]] 
[[0, 0, 0], [0, 1, 0], [0, 0, 2]] 
+2

あなたは 'deepcopy'になっているはずです... – jonrsharpe

+0

@jonrsharpeはどうもありがとうございました! deepcopyはこの問題を解決しました。あなたは質問への回答を投稿するべきです – robinp7720

+1

'possibilities.append(copy.deepcopy(self.board))' –

答えて

1

@jonrsharpeが認識しているように、deepcopyを使用して変数のコピーを作成できます。

オリジナルコード:

possibilities.append(self.board) 
possibilities[len(possibilities)-1][ycord][xcord] = 2 
print(self.board) 

新コード:

b = copy.deepcopy(self.board) 
possibilities.append(b) 
possibilities[len(possibilities)-1][ycord][xcord] = 2 
print(self.board) 
関連する問題