修改Python 2D列表中的元素[0] [0]

时间:2013-01-07 05:57:12

标签: python

  

可能重复:
  append to a sublist appends to every sublist

2D列表初始化为grid=[[False]*N] *N

打印网格产生:

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

现在我希望第1行和第1列中的元素为true。我只希望第1行和第1列中的元素为true。其他元素必须是假的。

grid[0][0]=True

将grid [0] [0]设置为true后,打印网格生成:

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

但是每一行的第一个元素现在都是True,但我只希望第一行的第一个元素为真。

请帮忙。我是Python的新手。

2 个答案:

答案 0 :(得分:3)

将单个参考数据类型相乘只会创建多个相同类型的引用。 这意味着[True] * N实际上是元素[True]

的相同实例的N倍

因此改变一个会无意中改变其他人

如以下示例所示,

>>> grid = [[True]]*10
>>> grid = [True]*10
>>> [id(e) for e in grid]
[505379788, 505379788, 505379788, 505379788, 505379788, 505379788, 505379788, 505379788, 505379788, 505379788]

它显示所有元素实际上都是同一个实例。

但是因为这里元素不是一个可变类型,所以改变不会成为问题,因为改变一个元素只会分配一个新实例。

可变类型出现问题

>>> [id(e) for e in grid]
[66523744, 66523744, 66523744, 66523744, 66523744, 66523744, 66523744, 66523744, 66523744, 66523744]
>>> grid[0][0]=False
>>> [id(e) for e in grid]
[66523744, 66523744, 66523744, 66523744, 66523744, 66523744, 66523744, 66523744, 66523744, 66523744]
>>> grid
[[False], [False], [False], [False], [False], [False], [False], [False], [False], [False]]

要克服它,你需要了解哪些是可变类型并避免重复它,而是创建相同可变类型的新多个实例

所以这里列表是一个可变类型,你需要创建多个实例,可能是通过列表理解

[[False]*N for _ in range(N)]

答案 1 :(得分:2)

this question非常相似,您的列表实际上指向同一个列表。而是将列表定义为:

[[False] * N for i in xrange(N)]

或者在Python 3中:

[[False] * N for i in range(N)]

然后修改一个元素将仅修改 该元素。

注意Python 3 range函数也适用于Python 2 - 但是在Python 2中,range函数返回一个列表,而不是Python 3中的range对象,以及Python 2的xrange对象,两者都是迭代器。