我正在尝试将其添加到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。)
答案 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)]