<分区>
关于问题:
How to initialize a two-dimensional array in Python?
在处理二维数组时,我发现以某种方式对其进行初始化会产生意想不到的结果。我想了解以这两种方式初始化 8x8 网格的区别:
>>> a = [[1]*8]*8
>>> 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, 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, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]]
对比
>>> A = [[1 for i in range(8)] for j in range(8)]
>>> 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, 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, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1]]
意想不到的结果是,使用索引 [0-6][x] 访问的任何元素都将指向 [7][x] 中的最后一行。数组在解释器中看起来 相同,因此我很困惑。第一种方法有什么问题?
如果相关,这些数组包含对代表棋盘方 block 的 GTK EventBoxes 的引用。将初始化方法更改为列表理解方法后,方 block 可以正确响应预期的悬停和单击事件。