2016-02-18 51 views
0

當調用如下所示的groupby_even_odd函數時,Python如何管理分配給函數變量的內存?
返回值後,函數變量even_nums/odd_nums使用的內存會發生什麼變化?
我的搜索產生的信息有點過於技術性,無法消化。如果任何人能指出我的一些好的信息或分享一些指針,我將不勝感激。
在此先感謝。Python中的內存和函數變量

def groupby_even_odd(numbers): 
    even_nums = [number for number in numbers if not number % 2] 
    odd_nums = [number for number in numbers if number % 2] 
    return {'even': even_nums, 'odd': odd_nums} 
+0

https://en.wikipedia.org/wiki/Garbage_collection_ (computer_science) – Barmar

回答

1

CPython的內存管理基於引用計數。基本上,它會跟蹤代碼中引用特定對象的「事物」數量。當引用計數下降到0時,對象的內存將被python收回以供重用或可能完全釋放。舉個例子:

  • 在你的功能,當你第一次創建even_nums,該名單有1引用計數(even_nums指列表)。
  • 然後當你到了return語句,您創建一個字典,還持有至even_nums的引用,這樣的引用計數變爲2
  • 返回,本地堆棧幀被銷燬/回收後,因此參考了本地堆棧幀保持在列表中(even_nums)消失,這會使參考計數回落到1.

在這一點上,我們不能說別的。如果調用者保持對返回值的引用,那麼引用計數將保持爲1.如果調用方未保留對返回值的引用,則引用計數將降至0,並且垃圾回收器將回收該內存。

循環引用也可能會出現一些細微之處(一個列表引用了一個指向列表的對象)。在這種情況下,引用計數無法自行降至0。幸運的是,python檢測到這些情況,並能夠釋放這些對象以防止內存泄漏。