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 遍,这样就会导致:当你修改一个元素的时候,实际上修改了一列元素!
使用Python列表复制时,直接使用乘号可能导致意外的引用共享。详解一维与多维列表复制的区别,避免修改元素时出现连锁反应。
2万+

被折叠的 条评论
为什么被折叠?



