本文的主要內(nèi)容是向大家分享幾個(gè)Python面試中的T題目,同時(shí)給出了答案并對其進(jìn)行分析,具體如下。
本文的原文是5 Great Python Interview Questions,同時(shí)謝謝 @非烏龜 指出我的疏漏,沒有來源標(biāo)記,也贊其細(xì)心,希望看文章的同時(shí)大家都能看下原文,因?yàn)槊總€(gè)人的理解不一致,原汁原味的最有幫助,我翻譯很多文章的目的一是為了自己以后找資料方便;二是作為一個(gè)索引,以后再看原文的時(shí)候,能更加快捷。其目的還是希望大家能看原文的。
問題一:以下的代碼的輸出將是什么? 說出你的答案并解釋。
class Parent(object): x = 1class Child1(Parent): passclass Child2(Parent): passprint Parent.x, Child1.x, Child2.xChild1.x = 2print Parent.x, Child1.x, Child2.xParent.x = 3print Parent.x, Child1.x, Child2.x
答案
以上代碼的輸出是:
1 1 11 2 13 2 3
使你困惑或是驚奇的是關(guān)于最后一行的輸出是 3 2 3 而不是 3 2 1。為什么改變了 Parent.x 的值還會改變 Child2.x的值,但是同時(shí) Child1.x 值卻沒有改變?
這個(gè)答案的關(guān)鍵是,在 Python 中,類變量在內(nèi)部是作為字典處理的。如果一個(gè)變量的名字沒有在當(dāng)前類的字典中發(fā)現(xiàn),將搜索祖先類(比如父類)直到被引用的變量名被找到(如果這個(gè)被引用的變量名既沒有在自己所在的類又沒有在祖先類中找到,會引發(fā)一個(gè) AttributeError 異常 )。
因此,在父類中設(shè)置 x = 1 會使得類變量 X 在引用該類和其任何子類中的值為 1。這就是因?yàn)榈谝粋€(gè) print 語句的輸出是1 1 1。
隨后,如果任何它的子類重寫了該值(例如,我們執(zhí)行語句 Child1.x = 2),然后,該值僅僅在子類中被改變。這就是為什么第二個(gè) print 語句的輸出是 1 2 1。
最后,如果該值在父類中被改變(例如,我們執(zhí)行語句 Parent.x = 3),這個(gè)改變會影響到任何未重寫該值的子類當(dāng)中的值(在這個(gè)示例中被影響的子類是 Child2)。這就是為什么第三個(gè) print 輸出是 3 2 3。
問題二:以下的代碼的輸出將是什么? 說出你的答案并解釋?
def div1(x,y): print("%s/%s = %s" % (x, y, x/y))def div2(x,y): print("%s//%s = %s" % (x, y, x//y))div1(5,2)div1(5.,2)div2(5,2)div2(5.,2.)答案
這個(gè)答案實(shí)際依賴于你使用的是 Python 2 還是 Python 3。
在 Python 3 中,期望的輸出是:
5/2 = 2.55.0/2 = 2.55//2 = 25.0//2.0 = 2.0
在 Python 2 中,盡管如此,以上代碼的輸出將是:
5/2 = 25.0/2 = 2.55//2 = 25.0//2.0 = 2.0
默認(rèn),如果兩個(gè)操作數(shù)都是整數(shù),Python 2 自動執(zhí)行整型計(jì)算。結(jié)果,5/2 值為 2,然而 5./2 值為 ```2.5``。
注意,盡管如此,你可以在 Python 2 中重載這一行為(比如達(dá)到你想在 Python 3 中的同樣結(jié)果),通過添加以下導(dǎo)入:
新聞熱點(diǎn)
疑難解答
圖片精選