python的一个面试题

今天遇到了个面试题,感觉很不错,补充了一下记录下来。

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值