2016-11-18 1 views
-2
def get_all_children(self): 
    zero = self.current_coords[0] 
    zero_row, zero_col = zero 
    states = [] 
    # blank spot is not on top row(middle or bottom) so we move up! 
    if zero_row > 0: 
     swapRow = zero_row - 1 
     tempState = copy.copy(self.current) # a list of list of strings 
     tempState[zero_row][zero_col], tempState[swapRow][zero_col] = tempState[swapRow][zero_col], tempState[zero_row][zero_col] 
     s = State(tempState) 
     states.append(s) 
    ## blank spot is not on the bottom row(middle or top) so we move down! 
    if zero_row < 2: 
     swapRow = zero_row + 1 
     tempState = copy.copy(self.current) 
     tempState[zero_row][zero_col], tempState[swapRow][zero_col] = tempState[swapRow][zero_col], tempState[zero_row][zero_col] 
     s = State(tempState) 
     states.append(s) 

をコピーされた後に変更されて、私は「現在の」という名前のリストのリストが含まれており、私はすべての可能な子ども(移動)を取得する関数を定義しようとしているStateクラスを持っています現在の状態。最初のIFステートメントでは、私は現在の変数(リストのリスト)のコピーを作成し、それを 'tempState'リストに格納してから、そのtempStateの値を入れ替えて、それを渡すStateオブジェクトを作成しようとしますそのオブジェクトをリストに追加します。すべてうまく動作します。問題は、2番目のIF文になるときです。私はスワップをした後、私はコピーを作成したにもかかわらず、オリジナルの '現在の'変数を修正しました!なぜ私は理解できません。 リスト(self.current)、self.current [:]、copy.cop(self.current)を試しました。助けてくださいPythonの元のリストはまだ

+0

[ドキュメント](https://docs.python.org/2/library/copy.html)をお読みになりましたか? – BrenBarn

+0

'State'クラスのコードを投稿してください。参照エラーがどこにあるのかわかりません。 – KeatsKelleher

+0

BrenBarnによると、リストのリストをコピーする場合は、 'deepcopy()'が必要です。 – TemporalWolf

答えて

1

代わりにcopy.deepcopy(x)を使用する必要があります。

+0

ありがとう!、私はそれが属性付きのオブジェクトをコピーしたいと思っていたと思ったので、私はそれをするとは思わなかった。 – David

関連する問題