1

基本上我想要做的是,创建一个嵌套列表并将其元素之一的值设置为列表中其他元素的函数。

>>> a = [[1]*5]*5
>>> a
[[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]]
>>> a[2][2] = a[0][2] + a[2][1]
>>> a
[[1, 1, 2, 1, 1], [1, 1, 2, 1, 1], [1, 1, 2, 1, 1], [1, 1, 2, 1, 1], [1, 1, 2, 1, 1]]
>>> a[3][2]   
2
>>> a[4][2]
2
>>> a[4][4]
1

我只是设置了 a[2][2] 的值,但是第三列中的每个元素都设置了相同的值。到底发生了什么,我怎样才能得到想要的行为?

4

2 回答 2

2

发生的情况是a最终包含对同一子列表的五个引用。当您更改一个子列表时,它们都会更改。

要查看这一点,请应用id()到每个子列表:

>>> map(id, a)
[8189352, 8189352, 8189352, 8189352, 8189352]

如您所见,它们都具有相同的 ID,这意味着它们是同一个对象。

要修复,更换

a = [[1]*5]*5

a = [[1]*5 for _ in range(5)]

现在子列表是独立的对象:

>>> map(id, a)
[21086256, 18525680, 18524720, 19331112, 18431472]
于 2013-03-27T06:58:06.153 回答
1

问题是您的列表a包含对同一列表的五个引用。你需要做这样的事情:

a = []
for _ in range(5):
    a += [[1] * 5]
于 2013-03-27T06:58:47.407 回答