今天遇到了个面试题,感觉很不错,补充了一下记录下来。
a = [[]] b = [[]]*5 print 'b:%s'%b list1 = b[1].append(10) print 'list1:%s'%list1 print 'b:%s'%b list2 = b[2].append(20) print 'list2:%s'%list2 print 'b:%s'%b
先做再看答案吧。答案:b:[[], [], [], [], []] list1:<span style="font-family: 宋体;">[[], [10], [], [], []]</span> b:[[10], [10], [10], [10], [10]] list2:<span style="font-family: 宋体;">[[], [], [20], [], []]</span> b:[[], [], [20], [], []]
如果上面你都对的上,说明你应该看下下面的正确答案,要是不相信还可以自己敲敲,说不定你会有更多的想法或者迷惑。正确答案:b:[[], [], [], [], []] list1:None b:[[10], [10], [10], [10], [10]] list2:None b:[[10, 20], [10, 20], [10, 20], [10, 20], [10, 20]]
解析:
[[]]*5不是得到[[]][[]][[]][[]][[]](肯定有人得到这个答案滴)
看看下面:
得到
<span style="font-size:18px;">list1:<span style="font-family:宋体;">None</span></span>
是因为append操作后是没有返回值的,所以是None,
b:[[10], [10], [10], [10], [10]]
简单的说是因为5个列表指向的是同一个列表(也就是a),看下面(请忽略图丑)
这里的[[]]*5就相当于图中那样定义了几个新的变量,但是他们都是指向同一个列表(这其实是浅拷贝)。
<span style="font-size:18px;">b:[[10, 20], [10, 20], [10, 20], [10, 20], [10, 20]]</span>
这是因为上面
<span style="font-size:18px;">list1 = b[1].append(10)</span>
已经把原列表更改了,所以不是
<span style="font-size:18px;">b:[[20], [20], [20], [20], [20]]</span>
(这里容易粗心忘记之前对列表的更改)
<pre name="code" class="python" style="font-size: 18px;">