分配到列表列表中的位置

时间:2012-11-21 08:39:49

标签: python list

假设我在Python中有一个值表。我用这种方式生成表格:

table = [[True] * 11] * 7

这将列出7个列表,每个列表包含11个True值:

[[True True True True True True True True True True True],
 [True True True True True True True True True True True],
 [True True True True True True True True True True True],
 [True True True True True True True True True True True],
 [True True True True True True True True True True True],
 [True True True True True True True True True True True],
 [True True True True True True True True True True True]]

说我将table[6][4]更改为Falsetable[6][4] = False)。我希望只有 才能更改该插槽:

[[True True True True True  True True True True True True],
 [True True True True True  True True True True True True],
 [True True True True True  True True True True True True],
 [True True True True True  True True True True True True],
 [True True True True True  True True True True True True],
 [True True True True True  True True True True True True],
 [True True True True False True True True True True True]]

但显然每个其他名单中的第4栏也有所改变:

[[True True True True False True True True True True True],
 [True True True True False True True True True True True],
 [True True True True False True True True True True True],
 [True True True True False True True True True True True],
 [True True True True False True True True True True True],
 [True True True True False True True True True True True],
 [True True True True False True True True True True True]]

发生了什么事?

3 个答案:

答案 0 :(得分:4)

您桌子的7个元素中的每一个都指向同一个列表?

>>> x = range(5)
>>> y = x
>>> print x
[0, 1, 2, 3, 4]
>>> print y
[0, 1, 2, 3, 4]
>>> x.append("ABC")
>>> print x
[0, 1, 2, 3, 4, 'ABC']
>>> print y
[0, 1, 2, 3, 4, 'ABC']

您可以使用deepcopy确保始终添加列表的新实例:

from copy import deepcopy
table = [[True] * 11] * 7
table = [deepcopy(x) for x in table]
# now this will behave as you expected
table[6][4] = False

答案 1 :(得分:4)

如果你这样做

table = [[True] * 11] * 7

您创建一个包含11 True s的列表,然后将其包装在列表中七倍。不是通过复制它,而是通过多次引用它。

如果您创建了7个不同的列表,例如

table = [[True] * 11 for _ in range(7)]
你生活得更好。

答案 2 :(得分:3)

当您以这种方式创建列表时,它们指向内存中的相同位置,因此任何更改都将反映在每个列表中:

In [1]: table = [[True] * 11] * 7

In [2]: id(table[0])
Out[2]: 17815672

In [3]: id(table[1])
Out[4]: 17815672

至于创建表的正确方法,@ glglgl的答案是要走的路。