2016-11-20 1 views
0

Ich kann mir nicht vorstellen, warum mein Python-Code in gewisser Weise funktioniert.Python gibt bei jeder Iteration einen anderen Wert aus, der Wert wird jedoch nicht geändert.

Da ich nicht "aktuelle" ändern, sollte die Ausgabe für jede Iteration gleich sein? Dies ist ein Problem, da ich "current" (Strom) als gleich definieren muss, damit jeder Node aus demselben Startwert generiert wird.

Siehe den folgenden Code:

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

Ausgang:

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

nach einer kurzen Debug-Sitzung, die ich gerade gemacht habe, ist das Problem in 'new.swap (xPos, yPos)'. Ich meine, hier ändert sich "Strom". immer noch versuchen herauszufinden, was genau passiert. – noamgot

+1

'def getBoard (selbst):' das ist nicht Java. Mach keine Getter und Setter. –

Antwort

2

das Problem ist, dass Sie in current innerhalb der board Variable in Knoten einen Verweis auf das Array speichern. Auf diese Weise wird dieses Array geändert, wenn Sie swap aufrufen. Stattdessen möchten Sie wahrscheinlich eine neue Kopie des Arrays in jedem Knoten, Sie können copy.deepcopy(node) dafür verwenden.

0

eine Variable zuordnen, die zu einer anderen Variablen in einer Liste zeigt, bedeutet nicht, zu Kopie die Liste.

new = Node(current) schafft ein Objekt vom Typ Node deren self.board Punkte auf der gleichen Liste wie current, so, wenn Sie new ändern, wird current auch geändert.

Um dies zu vermeiden, verwenden Sie die folgenden Schritte aus:

from copy import copy 

new = Node(copy(current)) 
+1

Ich wollte dasselbe sagen;) –

Verwandte Themen