我可以用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]]
为什么这样做?
答案 0 :(得分:1)
您在前两个列表中遇到此行为的原因是所有子列表引用内存中的相同列表对象。但是,在列表3中,因为您在内存中创建了截然不同的列表对象,所以可以对每个列表进行更改。
当您在内存中[l]*n
未制作新的不同列表时,您只需对元素n
进行l
次引用。
答案 1 :(得分:0)
这是因为前两个例子中没有克隆元素。它们仍指向同一内存地址的相同项目。下面的示例显示前两个子列表具有相同的内存地址
>>> a=[[0]*2]*10
>>> id(a[0])
4354222408
>>> id(a[1])
4354222408