溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

常被提問的Python面試題有哪些

發(fā)布時間:2020-08-03 09:57:40 來源:億速云 閱讀:157 作者:清晨 欄目:編程語言

小編給大家分享一下常被提問的Python面試題有哪些,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

這三大經(jīng)典Python面試題,最基礎,卻最常被面試官問!很多時候,我們在面試的時候,出其不意的面試官會問一些基礎的問題,但你還不一定會,這時就會很尷尬了!

Python面試題(一)之交換變量值

平時時不時會面面實習生,大多數(shù)的同學在學校里都已經(jīng)掌握了Python。面試的時候要求同學們實現(xiàn)一個簡單的函數(shù),交換兩個變量的值,大多數(shù)的同學給出的都是如下的答案:

常被提問的Python面試題有哪些

實際上,Python中還有更簡潔的更具Python風格的實現(xiàn),如下:

常被提問的Python面試題有哪些

相比前一種方法,后一種方法節(jié)省一個中間變量,在性能上也優(yōu)于前一種方法。

我們從Python的字節(jié)碼來深入分析一下原因。

常被提問的Python面試題有哪些

dis是個反匯編工具,將Python代碼翻譯成字節(jié)碼指令。這里的輸出如下:

常被提問的Python面試題有哪些

通過字節(jié)碼可以看到,swap1和swap2最大的區(qū)別在于,swap1中通過ROT_TWO交換棧頂?shù)膬蓚€元素實現(xiàn)x和y值的互換,swap2中引入了tmp變量,多了一次LOAD_FAST, STORE_FAST的操作。執(zhí)行一個ROT_TWO指令比執(zhí)行一個LOAD_FAST+STORE_FAST的指令快,這也是為什么swap1比swap2性能更好的原因。

Python面試題(二) is 和 == 的區(qū)別

面試實習生的時候,當問到 is 和 == 的區(qū)別時,很多同學都答不上來,搞不清兩者什么時候返回一致,什么時候返回不一致。本文我們來看一下這兩者的區(qū)別。

我們先來看幾個例子:

常被提問的Python面試題有哪些

上面的輸出結果中為什么有的 is 和 == 的結果相同,有的不相同呢?我們來看下官方文檔中對于 is 和 == 的解釋。

官方文檔中說 is 表示的是對象標示符是否一致,也就是比較兩個對象在內(nèi)存中的地址是否一樣,而 == 是用來檢查兩個對象是否相等。

我們在檢查 a is b 的時候,其實相當于檢查 id(a) == id(b)。而檢查 a == b 的時候,實際是調(diào)用了對象 a 的 eq() 方法,a == b 相當于 a.eq(b)。

一般情況下,如果 a is b 返回True的話,即 a 和 b 指向同一塊內(nèi)存地址的話,a == b 也返回True,即 a 和 b 的值也相等。

好了,看明白上面的解釋后,我們來看下前面的幾個例子

常被提問的Python面試題有哪些

打印出 id(a) 和 id(b) 后就很清楚了。只要 a 和 b 的值相等,a == b 就會返回True,而只有 id(a) 和 id(b) 相等時,a is b 才返回 True。

這里還有一個問題,為什么 a 和 b 都是 “hello” 的時候,a is b 返回True,而 a 和 b都是 “hello world” 的時候,a is b 返回False呢?

這是因為前一種情況下Python的字符串駐留機制起了作用。對于較小的字符串,為了提高系統(tǒng)性能Python會保留其值的一個副本,當創(chuàng)建新的字符串的時候直接指向該副本即可。所以 “hello” 在內(nèi)存中只有一個副本,a 和 b 的 id 值相同,而 “hello world” 是長字符串,不駐留內(nèi)存,Python中各自創(chuàng)建了對象來表示 a 和 b,所以他們的值相同但 id 值不同。

同學指出:intern機制和字符串長短無關,在交互模式下,每行字符串字面量都會申請一個新字符串,但是只含大小寫字母、數(shù)字和下劃線的會被intern,也就是維護了一張dict來使得這些字符串全局唯一)

總結一下,is 是檢查兩個對象是否指向同一塊內(nèi)存空間,而 == 是檢查他們的值是否相等??梢钥闯?,is 是比 == 更嚴格的檢查,is 返回True表明這兩個對象指向同一塊內(nèi)存,值也一定相同。

看到這里,大家是不是搞懂了 is 和 == 的區(qū)別呢?

那我們深入一步來思考一下下面這個問題:

Python里和None比較時,為什么是 is None 而不是 == None 呢?

Python面試題(三)可變對象和不可變對象

上一個面試題:Python面試之 is 和 == 的區(qū)別的最后留了一個問題:

Python里和None比較時,為什么是 is None 而不是 == None 呢?

這是因為None在Python里是個單例對象,一個變量如果是None,它一定和None指向同一個內(nèi)存地址。而 == None背后調(diào)用的是__eq__,而__eq__可以被重載,下面是一個 is not None但 == None的例子

Python中有可變對象和不可變對象之分??勺儗ο髣?chuàng)建后可改變但地址不會改變,即變量指向的還是原來的變量;不可變對象創(chuàng)建之后便不能改變,如果改變則會指向一個新的對象。

Python中dict、list是可變對象,str、int、tuple、float是不可變對象。

來看一個字符串的例子

常被提問的Python面試題有哪些

上面的例子里,修改a指向的對象的值會導致拋出異常。

執(zhí)行 a = a + " world"時,先計算等號右邊的表達式,生成一個新的對象賦值到變量a,因此a指向的對象發(fā)生了改變,id(a) 的值也與原先不同。

再來看一個列表的例子

常被提問的Python面試題有哪些

上面對a修改元素、添加元素,變量a還是指向原來的對象。

將a賦值給b后,變量b和a都指向同一個對象,因此修改b的元素值也會影響a。

變量c是對b的切片操作的返回值,切片操作相當于淺拷貝,會生成一個新的對象,因此c指向的對象不再是b所指向的對象,對c的操作不會改變b的值。

理解了上面不可變對象和可變對象的區(qū)別后,我們再來看一個有趣的問題

常被提問的Python面試題有哪些

明明group1和group2是不同的對象(id值不同),為什么調(diào)用group2的add_member方法會影響group1的members?

其中的奧妙就在于__init__函數(shù)的第二個參數(shù)是默認參數(shù),默認參數(shù)的默認值在函數(shù)創(chuàng)建的時候就生成了,每次調(diào)用都是用了這個對象的緩存。我們檢查id(group1.mebers)和id(group2.members),可以發(fā)現(xiàn)他們是相同的

print(id(group1.members)) # 輸出 140127132522040
print(id(group2.members)) # 輸出 140127132522040

所以,group1.members和group2.members指向了同一個對象,對group2.members的修改也會影響group1.members。

看完了這篇文章,相信你對常被提問的Python面試題有哪些有了一定的了解,想了解更多相關知識,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI