说是陷阱其实有点标题党,其实是最近的一次DEBUG结果。先看代码:
a=[1]*5
[1,1,1,1,1]
a[0]=2
[2,1,1,1,1]
这段代码的含义是复制了5个‘1’作为数组,修改其中一个元素后的结果。没毛病。但是:
b=[[1]2]2
[[1,1],[1,1]]
b[0][0]=2
[[2,1],[2,1]]
WTF!这显然不是我们想要的结果。其实问题也很简单,[object]*n=[object,object,...object],也就是说复制的是对象的引用而不是值复制。例如:
o=object()
[o]*2
[
可以看到,其实是同一个对象。