python的一個面試題
阿新 • • 發佈:2019-02-03
今天遇到了個面試題,感覺很不錯,補充了一下記錄下來。
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不是得到[[]][[]][[]][[]][[]](肯定有人得到這個答案滴)
看看下面:
得到
是因為append操作後是沒有返回值的,所以是None,<span style="font-size:18px;">list1:<span style="font-family:宋體;">None</span></span>
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;">