1. 程式人生 > >python的多維陣列操作

python的多維陣列操作

建立一個二維陣列,

#建立一個寬度為3,高度為4的陣列
#[[0,0,0], 
# [0,0,0],
# [0,0,0],
# [0,0,0]]
mylist = [[0] * 3] * 4

但是操作mylist[0][1] = 1的時候
發現整個第二列都被賦值為1

[[0,1,0],
[0,1,0],
[0,1,0],
[0,1,0]]

後來在The Python Standard Library 裡面找到答案
list * n—>n shallow copies of list concatenated, n個list的淺拷貝的連線:
list * n => list, list乘以n以後還是一個 list, 只是對原list裡面的 元素 是淺拷貝了n份。[ [0] ] * 3, 裡面的元素是 [0], 這是一個list,所以會存在淺拷貝之後指向同一個list的問題。

>>> lists = [[]] * 3
>>> lists
[[], [], []]
>>> lists[0].append(3)
>>> lists
[[3], [3], [3]]

[[]]是一個含有空列表的列表,所以[[]] * 3表示三個對[]的引用,修改任意一個,全體都會變
所以要用另一個方式建立多維陣列,以免引起淺拷貝

>>>list1 = [ [] for i in range(3)]
>>>list1
[[], [], []]
>>>list1[0].append(3)
>>>list1[1].append(3)
>>>list1[2].append(3)
[[3], [3], [3]]

這樣的話就可以避免淺拷貝的問題
同時,當lists = [[0] * 3] * 4時建立多維陣列, [0] * 3 , 裡面的元素是 0, 是一個 int ,不可變物件,淺拷貝沒問題