爲什麼以下對象對[x] * n
操作的行爲有所不同? 也就是說爲什麼第一個操作(in[94]
)修改了列表中的單個條目,而第二個操作(in[99]
)修改了全部是的條目?基本類型(int)與複雜類型(np.ndarray)之間的行爲差異
In [91]: x = 8
In [92]: y = [x] * 10
In [93]: y
Out[93]: [8, 8, 8, 8, 8, 8, 8, 8, 8, 8]
In [94]: y[1] = 4
In [95]: y
Out[95]: [8, 4, 8, 8, 8, 8, 8, 8, 8, 8]
In [96]: x = np.zeros(shape=(3,3))
In [97]: y = [x] * 10
In [98]: y
Out[98]:
[array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]]), array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]]), array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]]), array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]]), array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]]), array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]]), array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]]), array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]]), array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]]), array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]])]
In [99]: y[1][1,2] = 5
In [100]: y
Out[100]:
[array([[ 0., 0., 0.],
[ 0., 0., 5.],
[ 0., 0., 0.]]), array([[ 0., 0., 0.],
[ 0., 0., 5.],
[ 0., 0., 0.]]), array([[ 0., 0., 0.],
[ 0., 0., 5.],
[ 0., 0., 0.]]), array([[ 0., 0., 0.],
[ 0., 0., 5.],
[ 0., 0., 0.]]), array([[ 0., 0., 0.],
[ 0., 0., 5.],
[ 0., 0., 0.]]), array([[ 0., 0., 0.],
[ 0., 0., 5.],
[ 0., 0., 0.]]), array([[ 0., 0., 0.],
[ 0., 0., 5.],
[ 0., 0., 0.]]), array([[ 0., 0., 0.],
[ 0., 0., 5.],
[ 0., 0., 0.]]), array([[ 0., 0., 0.],
[ 0., 0., 5.],
[ 0., 0., 0.]]), array([[ 0., 0., 0.],
[ 0., 0., 5.],
[ 0., 0., 0.]])]
如果您複製了一個列表,例如,您將得到相同的行爲。 'X = [0,0,0]; Y = [X] * 4; Y [1] [1] = 2'。 – hpaulj
所以這是關於複合類型的一般情況,而不是關於'np.ndarray'的具體內容。 – jgyou
對,任何可變對象。只要你只是複製指針,修改一個都會修改它們。 – hpaulj