2017-01-07 6 views
1

Die folgende Klasse erstellt eine Liste und verwendet dann die Methode move_pieces, um die Reihenfolge der letzten beiden Elemente zu ändern und eine neue Liste zurückzugeben. Irgendwie, wenn ich den folgenden Code ausführe, gibt die Methode keine neue Liste zurück, sondern speichert über den self.state und die 'test' Liste, die ich erstellt habe, um den Code auszuführen. Irgendwelche Gedanken?Variablen, die zurückgesetzt werden

class node: 

    def __init__(self, state): 
     self.state = state 

    def move_piece(self): 
     new_node = self.state 
     new_node[7] , new_node[8] = new_node[8] , new_node[7] 
     return new_node 

test = [1,3,4,8,6,2,7,0,5] 
test_node = node(test) 
test_node.move_piece() 
+4

Das ist eine Menge von Code recht ist .... Sie können Kochen Sie es auf ein einfaches Beispiel? Wenn Sie jedoch die ursprüngliche Liste nicht ändern möchten, kopieren Sie einfach die Liste und ändern Sie die Kopie. – tdelaney

+0

In der Tat viel Code und ich bin mir nicht ganz sicher, was die Methode tun soll und was die erwartete Ausgabe ist. Auf den ersten Blick würde ich denken, dass 'zero_idx' und' item_idx' geschaltet werden (Zeile 82, 83)? – ppasler

+0

Sorry Leute. Neu im Stackoverflow. Die move_piece-Methode sollte self.state (eine Liste) nehmen und eine andere Liste zurückgeben (self.state reordered). Aber wenn ich die Methode verwende, wird der Wert von self.state geändert, anstatt nur eine neue Liste zurückzugeben und self.state gleich zu halten. – priorfire4411

Antwort

1

Vielen Dank für die Verbesserung der Qualität Ihrer Frage. Ihr Problem ist viel klarer und ich habe es neu geordnet, um das widerzuspiegeln.

... statt eine Kopie des Instanzenstatus zu erstellen und diese mit den letzten beiden Elementen zurückzuschalten, wechselt das Programm die Elemente und speichert das Attribut self.state. Irgendwelche Gedanken?

, dass wegen der Linie ist new_node = self.state, die im wesentlichen als self.state einen zweiten Verweis auf das gleiche Array im Speicher erklärt. Alle Änderungen, die unter Verwendung von new_node vorgenommen wurden, ändern das Array, auf das self.state verweist.

Um dies zu ändern, können Sie eine Kopie der Liste erstellen, indem new_node = self.state mit new_node = self.state[:] ersetzt:

class node: 
    def __init__(self, state): 
     self.state = state 

    def move_piece(self): 
     new_node = self.state[:] 
     new_node[7] , new_node[8] = new_node[8] , new_node[7] 
     return new_node 

test = [1,3,4,8,6,2,7,0,5] 
test_node = node(test) 
test_out = test_node.move_piece() 
print('test:\t\t\t\t{}'.format(test)) 
print('test_node.state:\t{}'.format(test_node.state)) 
print('test_out:\t\t\t{}'.format(test_out)) 

Ausgabe

test:    [1, 3, 4, 8, 6, 2, 7, 0, 5] 
test_node.state: [1, 3, 4, 8, 6, 2, 7, 0, 5] 
test_out:   [1, 3, 4, 8, 6, 2, 7, 5, 0] 
+0

Perfekt! Vielen Dank. Ich werde sicher sein, dass die Zeit in der Zukunft kürzer wird. Danke noch einmal! – priorfire4411

+0

@ priarfire4411 Keine Sorge, aber auf Stack Overflow [Abstimmung über und die Annahme von Antworten, die Ihr Problem lösen, werden gegenüber Dankeskommentaren bevorzugt] (http://stackoverflow.com/help/someone-answers). – Tagc

Verwandte Themen