3

I was writing a programm in Python (2.5.4), and I realized that my code was not working because of something very unusual. I am going to give an example:

A = [[0]*2]*2

When I print A, I get:

[[0, 0], [0, 0]]

That is ok. But now I want to change the element in the first column and firts row. So I type:

A[0][0] = 1

But when I print A again, I get:

[[1, 0], [1, 0]]

However, I was expecting

[[1, 0], [0, 0]]

This is ruinning all my code. I want to know why this is happening and how I can fix it.

On the other hand, when I type:

B = [[0,0],[0,0]]

And make:

B[0][0] = 1

I get:

[[1, 0], [0, 0]]

This is even stranger! Aren't the two ways of implementing matrices equivalent? What if I wanted a 100x100 matrix with zeros? For this case, with a 2x2 matrix, I can type [[0, 0], [0, 0]]. But that is not a good solution.

4

2 回答 2

7

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

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

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

在此处输入图像描述

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

在此处输入图像描述

我们a通过操纵l[0]l[0]是对 的引用)进行操作,因此我们可以通过将(与 相同)a更改为来更改第一个元素。al[0][0]a[0]"A"

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

在此处输入图像描述

于 2013-05-11T02:40:18.183 回答
4

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

使用列表推导:

[[0] * 100 for x in range(100)]
于 2013-05-11T02:48:26.030 回答