2

重複の可能性:
Python リストの問題

Python でのリストの動作がわかりません:

>>> a1 = [[0,0],[0,0]]
>>> a2 = [[0]*2]*2
>>> a1
[[0, 0], [0, 0]]
>>> a2
[[0, 0], [0, 0]]
>>> a1[0][0] = 1
>>> a2[0][0] = 1
>>> a1
[[1, 0], [0, 0]]
>>> a2
[[1, 0], [1, 0]]

ある要素の割り当てが別の要素に影響を与えるのはなぜですか? 答えてくれてありがとう!

4

1 に答える 1

7

リストを乗算すると、リストへの参照がコピーされ、リストのコピーは作成されません。リストは変更可能であるため、リストを変更すると、リストへのすべての参照が変更されます。

アスキーアート用語で:

a1 --- [list1, list2] --- list1 = [0, 0]
                      --- list2 = [0, 0]

a2 --- [list3, list3] --- list3 = [0, 0]

list3を変更すると、両方の位置に影響することがはっきりとわかります。

参照をコピーせずに可変長リストを作成する場合は、代わりに次のようにする必要があります。

>>> a2 = [[0]*2 for _ in range(2)]
>>> a2[0][0] = 1
>>> a2
[[1, 0], [0, 0]]

ここでは、古い要素への参照をコピーするのではなく、毎回新しい要素を作成するためにリスト内包表記を使用しています。繰り返したい既存の可変オブジェクトがある、より複雑な状況では、モジュールを使用することをお勧めcopyます

[0]*2Pythonのsは不変であり、変更できないため、操作は引き続きOKであることに注意してくださいint。したがって、同じオブジェクトへの参照があるかどうかは関係ありません。

于 2012-04-17T13:00:06.487 に答える