关于这个问题:用两个维阵列工作元(阵列)“乘法”与列表理解初始化
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]]
意想不到的结果,与的indeces [0-6] [访问的任何元素x]将指向[7] [x]中的最后一行。阵列看起来相同的解释,因此我的困惑。第一种方法有什么问题?
如果相关,这些数组持有对GTK EventBoxes的引用,这些引用表示棋盘的正方形。将初始化方法更改为列表理解方法后,方块会正确响应预期的悬停和单击事件。
我怀疑这可能已经被问及回答。我应该看起来更好...... –
因为'[1]'包含一个不可变的,所以你可以在范围(8)中使用'[[1] * 8]来生成所需的结果。 –
@MartijnPieters但是,假设'a = [1,2]'然后'[a] * 5'与'[a对于_范围(5)] ** **是一样的** ** –