2017-09-27 3 views
0

これは私の最初の投稿です。ここ数年のうちに、ただの隠れ家になってから、皆さんにこんにちはと言うのが私の喜びです!Pythonで2つの同一のリストを作成しました - 私の関数は私が意図しているものを更新していません

私は現在、自由な時間(特にPython)でコードを学習しています。私の2番目のプロジェクトを開発している間、私は意図したとおりに動作することを拒否する機能についてしまいました。私がなぜそれを見つけるのを助ける文書を見つけることができないので、私はここに赴くことに決めました。コードは次のとおりです。

def GridConstructor(InputGrid, RedPosition, BluePosition, SquareSize, StartingPositionA, StartingPositionB): 
CurrentPositionA = StartingPositionA 
CurrentPositionB = StartingPositionB 
x = 1 
for Line in range(19): 
    y = 1 
    for Row in range(18): 
     if [y, x] == BluePosition: 
      InputGrid[str(x) + ", " + str(y)] = [CurrentPositionA, CurrentPositionB], 1 
      print CurrentPositionA, CurrentPositionB 
     elif [y, x] == RedPosition: 
      InputGrid[str(x) + ", " + str(y)] = [CurrentPositionA, CurrentPositionB], 2 
      print CurrentPositionA, CurrentPositionB 
     else: 
      InputGrid[str(x) + ", " + str(y)] = [CurrentPositionA, CurrentPositionB], 0 
      print CurrentPositionA, CurrentPositionB 
     y += 1 
     CurrentPositionA[1] += SquareSize 
     CurrentPositionB[1] += SquareSize 
    x += 1 
    CurrentPositionA[0] += SquareSize 
    print CurrentPositionA[0] 
    CurrentPositionB[0] += SquareSize 
    print CurrentPositionB[0] 
    CurrentPositionA[1] = StartingPositionA[1] 
    print CurrentPositionA[1] 
    print StartingPositionA[1] 
    CurrentPositionB[1] = StartingPositionB[1] 
    print CurrentPositionB[1] 
    print StartingPositionB[1] 

(「印刷」は無視してください。デバッグ用に用意されています)

ご覧のとおり、グリッドパターンで[x、y]座標を格納している辞書を作成するのは非常に単純な関数です。デバッグで判断すると、問題は、 'SquareSize'を 'CurrentPositionA'に、CurrentPositionBを2番目の 'for'ループに追加した時点で、 'SquareSize'の値が何らかの理由で 'StartingPositionA'に追加され、および 'StartingPositionB'は、現在の位置トラッカーの両方のy値が最初のforループの各繰り返しの最後に元の値にリセットされないことを意味します。なぜ機能がそれをやっているのか全く分かりませんし、私を助けることができるドキュメンテーションを見つけることができません。私は実際には非常にばかばかしい、基本的なエラーであると確信していますが、誰かが私にこれを手伝うことができれば非常に感謝しています。

乾杯!

答えて

0

これらの2つの割り当てステートメントが原因で問題が発生しています。

CurrentPositionA = StartingPositionA 
CurrentPositionB = StartingPositionB 

私は問題に

list1 = [1,2] 
list2 = list1 
list1[1] = 3 
print(list1) 
print (list2) 
print (id(list1)) 
print (id(list2)) 

出力を説明してみましょう: - リスト1、リスト2の変数が一つの変数の変化に内容を変更することがあり、同じメモリ位置を指すために発生し

[1, 3] 
[1, 3] 
139674729442312 
139674729442312 

他の変数 の内容はあなたが期待したものではありません。 この問題を回避するには、割り当てだけでなく、オブジェクトをディープコピーする必要があります。

import copy 
list1 = [1,2] 
list2 = copy.deepcopy(list1) 
list1[1] = 3 
print(list1) 
print (list2) 
print (id(list1)) 
print (id(list2)) 

出力: -

[1, 3] 
[1, 2] 
139997249899528 
139997259457928 

は、基本的には以下のコマンドでCurrentPositionA、CurrentPositionBの割り当てを交換し、それが(コピーをインポートした後で)働くそれを参照してください。

CurrentPositionA = copy.deepcoy(StartingPositionA) 
CurrentPositionB = copy.deepcopy(StartingPositionB) 
関連する問題