1

次のコードがあります。

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 つだけを変更したい場合は、どうすればよいですか?

助けてくれてありがとう!

4

3 に答える 3

3

これを行う[0] * 2と、リストに結果が表示されます[0, 0]。これを 3 倍すると、そのリストへの 3 つの参照を含むリストが作成されます。おそらく代わりにこれを行いたいでしょう:

a = [[0] * 2 for _ in range(3)]
于 2012-06-06T00:17:31.127 に答える
2

私はこの問題を何度も見てきましたが、イライラします。

これを行う場合:

a = [[0] * 2] * 3

リスト[0, 0]を作成し、その参照を form に 3 回渡しますa。これらの複製されたリストは、元のリスト オブジェクトへの単なる参照です。1 つを変更すると、オリジナルが変更され、残りもすべて変更されます。

解決策は非常に簡単です。

a = [[0 for j in range(2)] for i in range(3)]

参照によってリストを渡す代わりに、毎回新しいリストを作成します。

于 2012-06-06T00:17:40.473 に答える
2

リストのすべての要素を変更するのはなぜですか?

それらはすべて同じ要素だからです。

要素の 1 つだけを変更したい場合は、どうすればよいですか?

の 3 つの異なるインスタンスを含むリストを作成する必要があります[0, 0]

リストを乗算すると、同じものを複数回参照するリストが作成されます。

たとえば、 を試してください[[0] * 2 for _ in range(3)]

問題がない理由は[0] * 2、両方の要素が「同じ0」であるという事実は問題にならないからです。0であり0、変更できません。書き込みは0 をa[0][0] = 1 置き換えますが、それを含む を変更します(を置き換えることにより)。[0, 0]00

于 2012-06-06T00:18:53.807 に答える