基本上我要做的是创建一个嵌套列表,并将其元素之一的值设置为列表中其他元素的函数。
>>> 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
我只设置了[2] [2]的值,但是为第3列中的每个元素设置了相同的值。究竟发生了什么,我怎样才能得到理想的行为?
答案 0 :(得分: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]
答案 1 :(得分:1)
问题是您的列表a
包含对同一列表的五个引用。你需要做这样的事情:
a = []
for _ in range(5):
a += [[1] * 5]