关于这个问题:
在使用二维数组时,我发现以某种方式对其进行初始化会产生意想不到的结果。我想了解以这两种方式初始化 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] 中的最后一行。数组在解释器中看起来相同,因此我很困惑。第一种方法有什么问题?
如果相关,这些数组包含对表示棋盘方格的 GTK EventBoxes 的引用。将初始化方法更改为列表理解方法后,方块会正确响应预期的悬停和单击事件。