二維list若用 [[0] * 5] * 5 這樣的方式初始化,則指定元素賦值也會造成所有行的該列也被賦值,與預期不符合。
因此建議,全用[[0] * 5 for _ in range(5)] 這樣的方式來初始化。
若后面不再修改值的話,兩個兩種都可以。
或者轉換為np.array()也可以避免這種錯誤。
>>> a = [[0] * 5] * 5
>>> a
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> b = [[0] * 5 for _ in range(5)]
>>> b
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> a == b
True
>>> a[0][1] = 1
>>> a
[[0, 1, 0, 0, 0], [0, 1, 0, 0, 0], [0, 1, 0, 0, 0], [0, 1, 0, 0, 0], [0, 1, 0, 0, 0]]
>>> b[0][1] = 1
>>> b
[[0, 1, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> a = [[0] * 5] * 5
>>> import numpy as np
>>> b = np.array(a)
>>> b
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])
>>> b[0][1] = 100
>>> b
array([[ 0, 100, 0, 0, 0],
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0]])
# 或直接用
b = np.zeros((5,5), dtype=np.int)
