Python面試3小題(一)
阿新 • • 發佈:2018-12-19
一、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,寫的很詳細。