您的位置:首页 > 编程语言 > Python开发

python的一个面试题

2016-02-29 20:43 661 查看
今天遇到了个面试题,感觉很不错,补充了一下记录下来。

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;">


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 面试题 指向