簡體   English   中英

創建值並將其分配給Python 2d數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM