list和array(np)之间的区别?

时间:2014-04-25 12:36:03

标签: python arrays list adjacency-matrix

我正在尝试将其添加到100 * 100零矩阵中的某个特定位置。我的代码是这样的:

adjacency=[[0]*100]*100
while ...
    x=...
    y=...
    adjacency[x][y]=adjacency[x][y]+1

但它也增加了其他职位。在face中,adjacency [0] = adjacency [1] = .. = adjacency [99],而while循环中x,y的计算无法产生这种结果。

所以,我改成了阵列。我唯一改变的是:

邻接= np.zeros((100,100))

这次结果是正确的。邻接[i]不再相等。

有谁知道为什么? (使用Python2.7。)

2 个答案:

答案 0 :(得分:1)

*运算符对于创建列表,特别是多维列表并不总是一件好事。此运算符只是创建列表中元素的副本以填充较大的列表。这适用于基本类型,但不适用于其他对象。

例如,当您编写[0] * 100时,它会创建一个包含100个元素的列表,并为每个项目分配0。现在您拥有100个元素列表的引用。因此,当您编写[[0] * 100] * 100]时,您将获得列表[0] * 100的100个引用的列表。因此,当您更改值时,它会影响所有“行”,因为所有行都引用相同的列表。

这是一个较小的例子:

>>> a = [0] * 3
>>> print a
[0, 0, 0]
>>> b = [a] * 2
>>> print b
[[0, 0, 0], [0, 0, 0]]
>>> a[0] = 1
>>> print a
[1, 0, 0]
>>> print b
[[1, 0, 0], [1, 0, 0]]
>>> b[0][1] = 2
>>> print b
[[1, 2, 0], [1, 2, 0]]

答案 1 :(得分:0)

每次将第一行列表复制到其他99个位置。您需要为每一行创建一个新列表,如下所示:

adjacency=[[0] * 100 for y in range(100)]