這裏說的數組其實是python中的list, 因為它可以按索引(下標)取元素值,所以相當於是一個arraylist。
我們知道,一位數組的簡單初始化如下:
arr = [0] * 10 # 即[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
這樣可以得到一個長度為10的數組。
那麽二維情況下,能不能這麽做呢?
比如 arr2D = [[0] * 10 ] * 4 能按預期得到一個正常的10×4二維數組嗎?
答案是否定的。這樣做的確非常簡潔,但卻是有問題的,原因說明如下:
由於[0]*10是一個數組對象, [[0]*10]*4相當於把對象的引用複製了4次,也就是說修改10×4數組的任何一個元素,其他引用位置的元素也會被改變!
例如下麵的例子,這個結果顯然不是我們想要的。
>> a = [[0]*10]* 4
>> print 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, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
>> a[0][0] = 12345
>> print a
[ [12345, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[12345, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[12345, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[12345, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
事實上,在python中,要初始化二位數組,一種比較簡潔的正確方法是:
arr2D = [[ 0 for col in range(10) ] for row in range(4) ]
之前在實現某ML算法,存語料中的多個樣本時踩了這個坑,所以記錄下來加深下印象。
如果需要更高維度的數組,這種初始化方法就比較繞了,可以考慮將多維的元素表示成一個結構體,然後來個一維的數組就可以了。