python 版本 3.6
大家都知道对列表使用乘号 * 可以简便的复制元素,但是需要警惕:只限用于一维列表!
如果你用这种方法构造多维数组,就会出现如下 BUG!!
>>> a = [[0]*5]*10
>>> a
[[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]
>>> a[5][3] = 2
>>> a
[[0, 0, 0, 2, 0],
[0, 0, 0, 2, 0],
[0, 0, 0, 2, 0],
[0, 0, 0, 2, 0],
[0, 0, 0, 2, 0],
[0, 0, 0, 2, 0],
[0, 0, 0, 2, 0],
[0, 0, 0, 2, 0],
[0, 0, 0, 2, 0],
[0, 0, 0, 2, 0]]
估计是底层实现用的是浅拷贝,构造二维列表的时候只是把内部列表的引用复制 N 遍,这样就会导致:当你修改一个元素的时候,实际上修改了一列元素!