[英]Creating and assigning values to Python 2d array
我可以用python 3種方式創建2D數組:
#1 10 rows 2 column
arr2d = [[0]*2]*10
#2 10 rows 2 column
arr2d_2 = [[0,0]] *10
#3 10 rows 2 column, using list comprehension **internal [] missing in OP
arr2d_list = [[0 for j in xrange(2)] for i in xrange(10)]
為什么對於#1和#2,當我將值分配給數組的特定行和列時,卻將值分配給每一行中的所有列? 例如
arr2d[0][1]=10
arr2d
[[0, 10], [0, 10], [0, 10], [0, 10], [0, 10], [0, 10], [0, 10], [0, 10], [0, 10], [0, 10]]
arr2d_2[0][1]=10
arr2d_2
[[0, 10], [0, 10], [0, 10], [0, 10], [0, 10], [0, 10], [0, 10], [0, 10], [0, 10], [0, 10]]
但對於#3,它僅將值分配給特定的行和列
arr2d_list[0][1]=10
arr2d_list
[[0, 10], [0, 0], [9, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]
為什么會這樣呢?
您的前兩個列表出現此行為的原因是, 所有子列表都引用內存中的同一列表對象 。 但是,在列表三中,由於您在內存中創建了明顯不同的列表對象,因此可以對每個單獨的列表進行更改。
當您執行[l]*n
而不在內存中創建新的不同列表時,您只是在對元素l
進行n
引用。
這是因為在前兩個示例中沒有克隆元素。 它們仍然指向同一項目在相同的內存地址。 下面的示例顯示前兩個子列表具有相同的內存地址
>>> a=[[0]*2]*10
>>> id(a[0])
4354222408
>>> id(a[1])
4354222408
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.