色婷婷狠狠18禁久久YY,CHINESE性内射高清国产,国产女人18毛片水真多1,国产AV在线观看

為什么Python工程師很少像Java工程師那樣討論垃圾回收

張吉惟2年前13瀏覽0評論

為什么Python工程師很少像Java工程師那樣討論垃圾回收?

1、Python是如何進行bai內存管理du的?

Python的內存管理主要有三種機制:引用計數zhi機制、垃圾回收dao機制和內存池機制。

a. 引用計數

當給一個對象分配一個新名稱或者將一個對象放入一個容器(列表、元組或字典)時,該對象的引用計數都會增加。

當使用del對對象顯示銷毀或者引用超出作用于或者被重新賦值時,該對象的引用計數就會減少。

可以使用sys.getrefcount()函數來獲取對象的當前引用計數。多數情況下,引用計數要比我們猜測的大的 多。對于不可變數據(數字和字符串),解釋器會在程序的不同部分共享內存,以便節約內存。

b. 垃圾回收

當一個對象的引用計數歸零時,它將被垃圾收集機制處理掉。

兩個對象a和b相互引用時,del語句可以減少a和b的引用計數,并銷毀用于引用底層對象的名稱。然而由于每個對象都包含一個對其他對象的應用,因此引用

計數不會歸零,對象也不會銷毀。(從而導致內存泄露)。為解決這一問題,解釋器會定期執行一個循環檢測器,搜索不可訪問對象的循環并刪除它們。

c. 內存池機制

Python提供了對內存的垃圾收集機制,但是它將不用的內存放到內存池而不是返回給操作系統。

1)Pymalloc機制。為了加速Python的執行效率,Python引入了一個內存池機制,用于管理對小塊內存的申請和釋放。

2)Python中所有小于256個字節的對象都使用pymalloc實現的分配器,而大的對象則使用系統的 malloc。

3)對于Python對象,如整數,浮點數和List,都有其獨立的私有內存池,對象間不共享他們的內存池。也就是說如果你分配又釋放了大量的整數,用于緩存這些整數的內存就不能再分配給浮點數。

【Python環境】12道 Python面試題總結

2、什么是lambda函數?它有什么好處?

lambda 表達式,通常是在需要一個函數,但是又不想費神去命名一個函數的場合下使用,也就是指匿名函數

lambda函數:首要用途是指點短小的回調函數

lambda [arguments]: expression

>>> a=lambda x,y:x+y

>>> a(3,11)

3、Python里面如何實現tuple和list的轉換?

直接使用tuple和list函數就行了,type()可以判斷對象的類型。

4、請寫出一段Python代碼實現刪除一個list里面的重復元素。

這個地方用set可以實現。

5、Python里面如何拷貝一個對象?(賦值,淺拷貝,深拷貝的區別)

賦值(=),就是創建了對象的一個新的引用,修改其中任意一個變量都會影響到另一個。

淺拷貝:創建一個新的對象,但它包含的是對原始對象中包含項的引用(如果用引用的方式修改其中一個對象,另外一個也會修改改變){1,完全切片方法;2,工廠函數,如list();3,copy模塊的copy()函數}

深拷貝:創建一個新的對象,并且遞歸的復制它所包含的對象(修改其中一個,另外一個不會改變){copy模塊的deep.deepcopy()函數}

6、介紹一下except的用法和作用?

try…except…except…[else…][finally…]

執行try下的語句,如果引發異常,則執行過程會跳到except語句。對每個except分支順序嘗試執行,如果引發的異常與except中的異常組匹配,執行相應的語句。如果所有的except都不匹配,則異常會傳遞到下一個調用本代碼的最高層try代碼中。

try下的語句正常執行,則執行else塊代碼。如果發生異常,就不會執行

如果存在finally語句,最后總是會執行。

【Python環境】12道 Python面試題總結

7、Python里面match()和search()的區別?

re模塊中match(pattern,string [,flags]),檢查string的開頭是否與pattern匹配。

re模塊中research(pattern,string [,flags]),在string搜索pattern的第一個匹配值。

>>> print(re.match(‘super’, ‘superstition’).span())

(0, 5)

>>> print(re.match(‘super’, ‘insuperable’))

None

>>> print(re.search(‘super’, ‘superstition’).span())

(0, 5)

>>> print(re.search(‘super’, ‘insuperable’).span())

(2, 7)

8、用Python匹配HTML tag的時候,<.*>和<.*?>有什么區別?

術語叫貪婪匹配( <.*> )和非貪婪匹配( <.*?> )

例如:

test

<.*> :

test

<.*?> :

9、以下的代碼的輸出將是什么? 說出你的答案并解釋

輸出:

使你困惑或是驚奇的是關于最后一行的輸出是 3 2 3 而不是 3 2 1。為什么改變了 Parent.x 的值還會改變 Child2.x 的值,但是同時 Child1.x 值卻沒有改變?

個答案的關鍵是,在 Python

中,類變量在內部是作為字典處理的。如果一個變量的名字沒有在當前類的字典中發現,將搜索祖先類(比如父類)直到被引用的變量名被找到(如果這個被引用的

變量名既沒有在自己所在的類又沒有在祖先類中找到,會引發一個 AttributeError 異常 )。

因此,在父類中設置 x = 1 會使得類變量 X 在引用該類和其任何子類中的值為 1。這就是因為第一個 print 語句的輸出是 1 1 1。

隨后,如果任何它的子類重寫了該值(例如,我們執行語句 Child1.x = 2),然后,該值僅僅在子類中被改變。這就是為什么第二個 print 語句的輸出是 1 2 1。

最后,如果該值在父類中被改變(例如,我們執行語句 Parent.x = 3),這個改變會影響到任何未重寫該值的子類當中的值(在這個示例中被影響的子類是 Child2)。這就是為什么第三個 print 輸出是 3 2 3。

10、以下代碼將輸出什么?

答案

以上代碼將輸出 [],并且不會導致一個 IndexError。

正如人們所期望的,試圖訪問一個超過列表索引值的成員將導致 IndexError(比如訪問以上列表的 list[10])。盡管如此,試圖訪問一個列表的以超出列表成員數作為開始索引的切片將不會導致 IndexError,并且將僅僅返回一個空列表。

【Python環境】12道 Python面試題總結

一個討厭的小問題是它會導致出現 bug ,并且這個問題是難以追蹤的,因為它在運行時不會引發錯誤。

11、以下的代碼的輸出將是什么? 說出你的答案并解釋?

你將如何修改 extendList 的定義來產生期望的結果

以上代碼的輸出為:

許多人會錯誤的認為 list1 應該等于 [10] 以及 list3 應該等于 ['a']。認為 list 的參數會在 extendList 每次被調用的時候會被設置成它的默認值 []。

盡管如此,實際發生的事情是,新的默認列表僅僅只在函數被定義時創建一次。隨后當 extendList 沒有被指定的列表參數調用的時候,其使用的是同一個列表。這就是為什么當函數被定義的時候,表達式是用默認參數被計算,而不是它被調用的時候。

因此,list1 和 list3 是操作的相同的列表。而 ````list2是操作的它創建的獨立的列表(通過傳遞它自己的空列表作為list``` 參數的值)。

extendList 函數的定義可以做如下修改,但,當沒有新的 list 參數被指定的時候,會總是開始一個新列表,這更加可能是一直期望的行為。

12、以下程序輸出什么?

吧,第一行代碼覺對是我第一次見,第一行輸出的是[[], [], [], [], []],一個含有5個空列表的列表,而第二行輸出的是[[10],

[10], [10], [10],

[10]],我只能解釋為這5個列表指向了同一個列表,所以修改任意一個其它4個都會改變,可以用list[0]=10 斷開一個連接試試。

java垃圾回收,為什么Python工程師很少像Java工程師那樣討論垃圾回收