1. 程式人生 > >python的一個面試題

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