python 对 List 使用乘号 * 时的 bug

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 遍,这样就会导致:当你修改一个元素的时候,实际上修改了一元素!

发布了274 篇原创文章 · 获赞 446 · 访问量 42万+

猜你喜欢

转载自blog.csdn.net/itnerd/article/details/103861652