次のコードがあります。
a=[[0]*2]*3
print a
a[1][1]=2
print a
出力は次のとおりです。
[[0,0],[0,0],[0,0]]
[[0,2],[0,2],[0,2]]
リストのすべての要素を変更するのはなぜですか?
出力は次のようにすべきではありません:
[[0,0],[0,2],[0,0]]
要素の 1 つだけを変更したい場合は、どうすればよいですか?
助けてくれてありがとう!
これを行う[0] * 2
と、リストに結果が表示されます[0, 0]
。これを 3 倍すると、そのリストへの 3 つの参照を含むリストが作成されます。おそらく代わりにこれを行いたいでしょう:
a = [[0] * 2 for _ in range(3)]
私はこの問題を何度も見てきましたが、イライラします。
これを行う場合:
a = [[0] * 2] * 3
リスト[0, 0]
を作成し、その参照を form に 3 回渡しますa
。これらの複製されたリストは、元のリスト オブジェクトへの単なる参照です。1 つを変更すると、オリジナルが変更され、残りもすべて変更されます。
解決策は非常に簡単です。
a = [[0 for j in range(2)] for i in range(3)]
参照によってリストを渡す代わりに、毎回新しいリストを作成します。
リストのすべての要素を変更するのはなぜですか?
それらはすべて同じ要素だからです。
要素の 1 つだけを変更したい場合は、どうすればよいですか?
の 3 つの異なるインスタンスを含むリストを作成する必要があります[0, 0]
。
リストを乗算すると、同じものを複数回参照するリストが作成されます。
たとえば、 を試してください[[0] * 2 for _ in range(3)]
。
問題がない理由は[0] * 2
、両方の要素が「同じ0
」であるという事実は問題にならないからです。0
であり0
、変更できません。書き込みは0 をa[0][0] = 1
置き換えますが、それを含む を変更します(を置き換えることにより)。[0, 0]
0
0