1

假设我在 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]False( table[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]]

这是怎么回事?

4

3 回答 3

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
于 2012-11-21T08:46:36.090 回答
4

如果你这样做

table = [[True] * 11] * 7

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

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

table = [[True] * 11 for _ in range(7)]

你过得更好。

于 2012-11-21T08:47:53.363 回答
3

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

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

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

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

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

于 2012-11-21T08:47:50.237 回答