我在Python(2.5.4)中编写了一个程序,我意识到我的代码因为一些非常不寻常的东西而无法工作。我将举一个例子:
A = [[0]*2]*2
当我打印A时,我得到:
[[0, 0], [0, 0]]
没关系。但是现在我想要更改第一列和第一行中的元素。所以我输入:
A[0][0] = 1
但是当我再次打印A时,我得到了:
[[1, 0], [1, 0]]
然而,我在期待
[[1, 0], [0, 0]]
这破坏了我的所有代码。我想知道为什么会这样,以及如何解决它。
另一方面,当我输入:
B = [[0,0],[0,0]]
并制作:
B[0][0] = 1
我明白了:
[[1, 0], [0, 0]]
这甚至更奇怪!实现矩阵的两种方式不是等价的吗?如果我想要一个带零的100x100矩阵怎么办?对于这种情况,使用2x2矩阵,我可以输入[[0,0],[0,0]]。但这不是一个好的解决方案。
答案 0 :(得分:7)
这是因为您的列表包含多个 引用 到列表中。
>>> a = [0]
>>> l = [a,a]
>>> l[0][0] = "A"
>>> l
[['A'], ['A']]
我们创建一个列表并将其绑定到a
。然后,我们会通过a
在列表l
中将两个引用存储到l=[a,a]
。然后我们操纵一个对a
的引用,并将其第一个元素更改为"A"
。由于引用将引用到内存中的某个位置,因此我操纵该引用(l
中的元素)会更改内存中的值,从而影响对a
的所有其他引用。
此插图描绘了上面的例子。箭头表示对a
的引用。他们 a
中的l = [a,a]
。当您更改其中一个时,您可以更改两者指向的值。这种互动可以这样描述:
我们通过操纵a
来操纵l[0]
(l[0]
是对a
的引用),因此我们可以通过更改来更改a
中的第一个元素l[0][0]
的{{1}}(与a[0]
相同)。{/ 1}}。
描述您的列表"A"
看起来像这样
答案 1 :(得分:4)
“如果你想要一个100 x 100的零矩阵怎么办?”
使用列表理解:
[[0] * 100 for x in range(100)]