【问题标题】:Problem with matrices in Python [duplicate]Python中的矩阵问题[重复]
【发布时间】:2013-05-05 18:49:24
【问题描述】:

我正在用 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]]。但这不是一个好的解决方案。

【问题讨论】:

  • 更一般地说,使用 numpy (numpy.org) 进行数值计算,而不是自己滚动。

标签: python


【解决方案1】:

这是因为您的列表包含对一个列表的多个引用

>>> a = [0]
>>> l = [a,a]
>>> l[0][0] = "A"
>>> l
[['A'], ['A']]

我们创建一个列表并将其绑定到a。然后,我们通过l=[a,a]a 的两个references 存储在l 列表中。然后我们操作 onea 的引用,并将它的第一个元素更改为"A"。由于引用引用内存中的某个位置,我操作该引用(l 中的任何一个元素)我们会更改内存中的值,从而影响对a 的所有其他引用。

此插图描述了上面的示例。箭头表示对a 的引用。它们l = [a,a] 中的a。当您更改其中一个时,您更改了它们指向的值。这种交互可以这样描述:

我们通过操作l[0]l[0] 是对a 的引用)来操作a,因此我们可以通过更改l[0][0] 来更改a 中的第一个元素(这与a[0]) 转为"A"

您的列表[[0]*2]*2 的描述如下所示

【讨论】:

    【解决方案2】:

    “如果你想要一个 100 x 100 的零矩阵怎么办?”

    使用列表推导:

    [[0] * 100 for x in range(100)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 2014-02-09
      • 1970-01-01
      相关资源
      最近更新 更多