Python創建二維數組的正確姿勢


參考:https://zhuanlan.zhihu.com/p/88197389



列表是基於 PyListObject 實現的。PyListObject 是一個變長對象,所以列表的長度是隨着元素多少動態改變的。同時它還支持插入和刪除等操作,所以它還是一個可變對象

錯誤示范

list_one = [0]
list_two = [[0] * 3] * 3
print(list_one)
print(list_two)

>>> 運行結果:

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

看起來很完美的操作,但是如果進行一些列表更新操作,問題就顯露出來了。比如我對 list_two 的更換中間位置的值,即對 list_two[1][1] 進行更換值

list_two = [[0] * 3] * 3
print(list_two)

list_two[1][1] = 2
print(list_two)

不難發現,運行結果有點不對勁,列表中有三個位置的值也改變了

[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 2, 0], [0, 2, 0], [0, 2, 0]]

原因是淺拷貝,我們以這種方式創建的列表,list_two 里面的三個列表的內存是指向同一塊,不管我們修改哪個列表,其他兩個列表也會跟着改變


如果要使用列表創建一個二維數組,可以使用生成器來輔助實現

[[0 for i in range(3)] for j in range(3)]

list_three = [[0 for i in range(3)] for j in range(3)]
print(list_three)
list_three[1][1] = 3
print(list_three)
輸出
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 0, 0], [0, 3, 0], [0, 0, 0]]



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM