2016-11-20 4 views
0

なぜ私のpythonコードが特定の方法で動作するのかについて私の頭を包み込むことはできません。Pythonは反復ごとに異なる値を出力しますが、値は変更されません。

私は "current"を変更しないので、出力は各繰り返しで同じになるはずですか?これは問題です。なぜなら、各ノードが同じ開始値から生成されるように、「現在」が同じである必要があるからです。

次のコードを参照してください。

tester.py

class Node: 
    def __init__(self, board=None): 
     self.board = board 

    def getBoard(self): 
     return self.board 

    def swap(self, xPos, yPos): # swap with zero 

     for a in self.board: 
      if 0 in a: 
       self.board[self.board.index(a)][a.index(0)] = self.board[xPos][yPos] 

     self.board[xPos][yPos] = 0 

open = [] 

def gen_nodes(current): 

    for i in [7, 15, 11]: 

     print(current) # <-- why does this print a different value each time? 

     new = Node(current) 

     for a in new.getBoard(): 
      if i in a: 
       xPos = new.getBoard().index(a) 
       yPos = a.index(i) 

     new.swap(xPos, yPos) 

     open.append(new) 

if __name__ == '__main__': 
    gen_nodes([[1, 2, 3, 4], 
       [8, 5, 6, 7], 
       [9, 10, 11, 0], 
       [12, 13, 14, 15]]) 

出力:

[[1, 2, 3, 4], [8, 5, 6, 7], [9, 10, 11, 0], [12, 13, 14, 15]] 
[[1, 2, 3, 4], [8, 5, 6, 0], [9, 10, 11, 7], [12, 13, 14, 15]] 
[[1, 2, 3, 4], [8, 5, 6, 15], [9, 10, 11, 7], [12, 13, 14, 0]] 
+0

私が作成したクイックデバッグセッションでは、問題は 'new.swap(xPos、yPos)'にあります。つまり、これは「現在の」変更箇所です。まだ正確に何が起こっているのか把握しようとしています。 – noamgot

+1

'def getBoard(self):'これはJavaではありません。ゲッターやセッターを作ってはいけません。 –

答えて

2

問題がある。これを回避する

は、以下を使用します。この方法で、swapを呼び出すと、この配列が変更されます。代わりに、おそらく、すべてのノードにアレイの新しいコピーが必要です。copy.deepcopy(node)を使用できます。

0

別の変数にリストを指す変数を割り当てると、コピーに意味するものではありませんがリスト

new = Node(current)self.boardポイントcurrentと同じリストに、そのたびにnewを変更し、currentも変更されるタイプNodeのオブジェクトを作成します。あなたはノードでboard変数内currentに配列への参照を保存することを、

from copy import copy 

new = Node(copy(current)) 
+1

私は同じことを言うつもりだった;) –

関連する問題