python二維數組初始化問題
引子:今天在寫用Python寫01背包的演算法課作業時,發現一個關於二維數組的小問題,本來期末已經很忙了,但這個問題還是值得記錄下來的,因為這不是第一次遇到了,這次花了將近一個小時才搞明白。 問題:
以如下方式初始化一個二維數組,在使用的過程中有沒有問題。
matrix = [[0] * n] * m
有問題。可以做個實驗:
>>> m = 3>>> n = 4>>> matrix = [[0] * n] * m>>> matrix[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]>>> matrix[1][2] = 1>>> matrix[[0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0]]>>>
可以看出,我只修改了matrix[1][2]這一個元素,但從結果來看,matrix這個二維數組的每一個一維數組的第3個(下標為2)元素都被修改了。對此我的理解是:在申請matrix數組時,“[0] * n”這個一維數組可能只申請了一個,“ * m”這操作,只是建立了m個指向“[0] * n”的引用,因此,若修改這個一維數組中的元素,則matrix中m個一位元組都會被修改。 更詳細解釋可以參考此篇部落格在python中定義二維數組。 解決方案:
換種初始化的方式:
>>> matrix = [[0] * n for i in range(0, m)]>>> matrix[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]>>> matrix[1][2] = 1>>> matrix[[0, 0, 0, 0], [0, 0, 1, 0], [0, 0, 0, 0]]>>>
可以看出,上述那種我們想要避免的情況已經不再出現了。 參考文獻
1.在python中定義二維數組,woshare,部落格園,http://www.cnblogs.com/woshare/p/5823303.html。