我当时正在用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]]。但这不是一个好的解决方案。
2 回答
慕少森
TA贡献2019条经验 获得超9个赞
这是因为您的列表包含对列表的多个引用。
>>> a = [0]
>>> l = [a,a]
>>> l[0][0] = "A"
>>> l
[['A'], ['A']]
我们创建一个列表并将其绑定到a。然后咱俩存储引用到a列表中的l通过l=[a,a]。然后,我们操纵一个参考a,它的第一个元素改变"A"。由于引用是指内存中的某个位置,因此我操纵该引用(中的任一元素l)会更改内存中的值,从而影响对的所有其他引用a。
此图描述了上面的示例。箭头代表对的引用a
。他们是在a
“S IN l = [a,a]
。当您更改其中之一时,将更改它们都指向的值。这种交互可以这样描述:
我们操纵a
通过操纵l[0]
(l[0]
为参考a
),因为这样就可以改变第一元件中a
,通过改变l[0][0]
(这将是相同的a[0]
),以"A"
。
您的清单的描述[[0]*2]*2
如下所示
添加回答
举报
0/150
提交
取消