繁体   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