2016-10-25 7 views
-1

次のような配列があり、2番目の行の真ん中のエントリの値を変更したいと思います。多次元リスト、あるサブリストの変更が他のサブリストに反映される

[[0, 1, 0], 
    [0, 1, 0], 
    [0, 1, 0]] 

なぜこれが動作しません。

array = [[0, 0, 0], 
      [0, 0, 0], 
      [0, 0, 0]] 
    array[1][1] = 1 

予想される出力:列全体の値が変更されたよう

[[0, 0, 0], 
    [0, 1, 0], 
    [0, 0, 0]] 

は、しかし、それはそうですか?私が望むエントリの値を変更するにはどうすればよいですか?

ありがとうございます!

+2

を。 – Barmar

+3

あなたのコードは本当ですか?または、 'a = [0、0、0]'を実行してから 'array = [a、a、a]'を実行しましたか?これにより、すべての行がコピーではなく同じアレイへの参照になります。 – Barmar

答えて

0

これは、質問に記載した方法で配列を作成していないためです。代わりに、あなたのように*を使用して作成しました:この場合

>>> [[0]*3]*3 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]] 

、すべてのネストされたリストはlistの同じ参照]をポイントしています。

>>> [[0]*3 for _ in range(3)] 
[[0, 0, 0], [0, 0, 0], [0, 0, 0]] 

このリストに操作の同じセットを実行するには、私が手:この問題を解決するために

>>> array = [[0]*3]*3 

>>> array[0][1] = 1 # updating 0th list 
>>> array 
[[0, 1, 0], [0, 1, 0], [0, 1, 0]] 
# ^  ^  ^all 1 indexes updated 

>>> array[1][0] = 2 # updating 1st list 
>>> array 
[[2, 1, 0], [2, 1, 0], [2, 1, 0]] 
#^  ^  ^ all 0 indexes updated 

は、arrayのようなあなたを作る:リスト内の任意の値を更新すると、すべてのリストの変更を反映します:

>>> array = [[0]*3 for _ in range(3)] 

>>> array[0][1] = 1 
>>> array 
[[0, 1, 0], [0, 0, 0], [0, 0, 0]] 
# ^ Only one value updated as expected 

>>> array[1][0] = 2 
>>> array 
[[0, 1, 0], [2, 0, 0], [0, 0, 0]] 
#   ^again as expected  
+0

はい、それは私がやったことです、ありがとう!配列を宣言するさまざまな方法に違いがあるかどうかはわかりませんでした。 –

+0

@DawnChen:それが助けられたら、それを受け入れられたものとしてマークします(答えの左にあるクリックボタン)。受諾された回答は、将来同じ問題の解決を求める他の人のための参考になります –

0

これを実行すると、予想される出力が得られます。

私はあなたが上に示したようにあなたの配列を宣言していない可能性が高いと思います。 [0] =配列[1] =ここでは何が起こっている

array = [[0, 0, 0]] * 3 

あなたは1つのアレイの行を作成しているで、[0、0、0]と配列を設定:私はあなたがこのようなあなたの配列を宣言した推測するつもりです配列[2] = [0、0、0]。それらがすべて1つの行を指しているので、その行の1つの値を変更すると、その変更は3つの行すべてに表示されます。

あなたはリスト内包して配列を初期化する場合は、その都度新しい行を作成している、とあなたが予想される出力を取得します:私はこれを再現することはできません

array = [[0, 0, 0] for i in range(3)] 
関連する問題