1. 程式人生 > >Python面試3小題(一)

Python面試3小題(一)

一、Python中賦值,淺拷貝和深拷貝的區別?
參考部落格:https://www.cnblogs.com/xueli/p/4952063.html
1、賦值
在python中,物件賦值實際上是物件的引用。當建立一個物件,然後把它賦給另一個變數的時候,python並沒有拷貝這個物件,而只是拷貝了這個物件的引用。也就是說,物件賦值,兩個變數共用的是一個地址。

>>> b=alist
>>> print b
[1, 2, 3, ['a', 'b']]
>>> alist.append(5)
>>> print alist;print b
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b'], 5]

2、淺拷貝
copy淺拷貝,如其字義,只拷貝了淺層,沒有拷貝深層的子物件。如list中還帶有其他list,那麼這些其他list就沒有拷貝,和賦值一樣,屬於公共部分。所以原始資料中深層子物件改變了,被拷貝的變數的子物件會改變。

>>> import copy
>>> c=copy.copy(alist)
>>> print alist;print c
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]
>>> alist.append(5)
>>> print alist;print c
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]
>>> alist[3]
['a', 'b']
>>> alist[3].append('cccc')
>>> print alist;print c
[1, 2, 3, ['a', 'b', 'cccc'], 5]
[1, 2, 3, ['a', 'b', 'cccc']] 裡面的子物件被改變了

3、深拷貝
deepcopy深拷貝,包含物件裡面的所有物件的拷貝,所以原始物件的改變不會造成深拷貝里任何子元素的改變。

>>> import copy
>>> d=copy.deepcopy(alist)
>>> print alist;print d
[1, 2, 3, ['a', 'b']]
[1, 2, 3, ['a', 'b']]始終沒有改變
>>> alist.append(5)
>>> print alist;print d
[1, 2, 3, ['a', 'b'], 5]
[1, 2, 3, ['a', 'b']]始終沒有改變
>>> alist[3]
['a', 'b']
>>> alist[3].append("ccccc")
>>> print alist;print d
[1, 2, 3, ['a', 'b', 'ccccc'], 5]
[1, 2, 3, ['a', 'b']]  始終沒有改變

二、lamda表示式
lambda只是一個表示式,函式體比def簡單很多,很多時候定義def,然後寫一個函式太麻煩,這時候就可以用lambda定義一個匿名函式。
lambda的主體是一個表示式,而不是一個程式碼塊。僅僅能在lambda表示式中封裝有限的邏輯進去。
可以參考:https://blog.csdn.net/yinxingtianxia/article/details/78121815

三、python的for迴圈與迭代器、生成器
不清楚的可以參考部落格:https://www.cnblogs.com/scolia/archive/2016/05/30/5538666.html,寫的很詳細。