より説明的に説明しようとすると、
操作1:
x = [[0, 0], [0, 0]]
print(type(x)) # <class 'list'>
print(x) # [[0, 0], [0, 0]]
x[0][0] = 1
print(x) # [[1, 0], [0, 0]]
操作2:
y = [[0] * 2] * 2
print(type(y)) # <class 'list'>
print(y) # [[0, 0], [0, 0]]
y[0][0] = 1
print(y) # [[1, 0], [1, 0]]
最初のリストの最初の要素を変更しなかったのに、各リストの2番目の要素が変更されなかったのはなぜですか。これ[0] * 2
は、実際には2つの数値のリストであり、0への参照は変更できないためです。
クローンコピーを作成する場合は、操作3を試してください。
import copy
y = [0] * 2
print(y) # [0, 0]
y = [y, copy.deepcopy(y)]
print(y) # [[0, 0], [0, 0]]
y[0][0] = 1
print(y) # [[1, 0], [0, 0]]
クローンコピーを作成するもう1つの興味深い方法、オペレーション4
import copy
y = [0] * 2
print(y) # [0, 0]
y = [copy.deepcopy(y) for num in range(1,5)]
print(y) # [[0, 0], [0, 0], [0, 0], [0, 0]]
y[0][0] = 5
print(y) # [[5, 0], [0, 0], [0, 0], [0, 0]]
[x]*3
のように3つの参照を保存[x, x, x]
するのx
は、が変更可能な場合のみです。これは、たとえばa=[4]*3
、以降a[0]=5
はa=[5,4,4].