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的新手。
答案 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
对象,两者都是迭代器。