Python 基礎:垃圾回收

2025年01月23日01:23:04 科技 1181

垃圾回收這是 Python 內存管理系統的重要組成部分。雖然引用計數適用於大多數場景,但垃圾回收解決了僅引用計數不夠的情況,尤其是在處理循環引用時。了解垃圾回收的工作原理將有助於您編寫高效、內存安全的 Python 程序。

什麼是垃圾回收?

垃圾回收是 Python 回收不再使用的內存的方法。它與引用計數一起工作,以確保從內存中刪除未使用的對象。

關鍵思想如下:

  • 當對象的引用計數達到零時,Python 的內存管理器會銷毀該對象並回收內存。
  • 但是,在更複雜的情況下(如循環引用),垃圾回收會介入進行清理。

垃圾回收是自動的,並定期在後台運行,但 Python 還提供了以編程方式控制和檢查垃圾回收的方法。

循環引用和引用計數的限制

什麼是循環引用?

當兩個或多個對象相互引用時,將發生循環引用,從而創建一個循環。讓我們舉個例子:

Python 基礎:垃圾回收 - 天天要聞

這裡:

  • A.B 指向 B,B.A 指向 A。這將創建一個循環引用

引用計數失敗的原因

現在,如果我們刪除對 ab 的引用:

Python 基礎:垃圾回收 - 天天要聞

對象 ab 仍在相互引用:

  • a 的引用計數為 1(來自 B.A)。
  • B 的引用計數為 1(來自 A.B)。

由於它們的引用計數不為零,因此 Python 的引用計數機制無法銷毀它們,從而將它們無限期地留在內存中。這就是垃圾回收的用武之地。

垃圾回收器如何處理循環引用

垃圾回收器通過分析內存中跟蹤的所有對象來識別循環引用。如果它找到一組僅相互引用(並且無法訪問)的對象,它會中斷循環並回收內存。

這可以防止內存泄漏,當不再需要的內存未釋放時,會發生內存泄漏。

使用gc模塊

Python 的 gc 模塊提供了多種工具來與垃圾回收器進行交互。以下是一些關鍵功能:

啟用或禁用垃圾回收

垃圾回收默認處於啟用狀態,但您可以根據需要禁用它(例如,出於性能原因):

Python 基礎:垃圾回收 - 天天要聞

手動觸發垃圾回收

您可以使用 gc.collect() 手動運行垃圾回收器:

Python 基礎:垃圾回收 - 天天要聞

檢查跟蹤對象

垃圾回收器跟蹤內存中的所有對象。您可以使用 gc.get_objects() 檢查這些內容:

Python 基礎:垃圾回收 - 天天要聞

常見問題和最佳實踐

性能影響

  • 垃圾回收可能會帶來較小的性能開銷,因為它會定期掃描內存以查找循環引用。
  • 除非絕對必要,否則請避免禁用它。

禁用垃圾回收的風險

  • 如果在未確保代碼沒有循環引用的情況下關閉垃圾回收,則存在內存泄漏的風險。

調試內存問題

  • 使用 gc.get_objects()gc.collect() 等工具來識別和解決內存問題。
  • 如果您創建具有複雜關係的自定義類,請進行全面測試。

垃圾回收是 Python 內存管理系統的重要組成部分。它通過解析循環引用和防止內存泄漏來補充引用計數。雖然它是自動的,並且在大多數情況下幾乎不需要干預,但 Python 的 gc 模塊提供了在需要時檢查和控制垃圾回收的工具。

Python 基礎:垃圾回收 - 天天要聞

科技分類資訊推薦

刷醫保可買手錶?一地暫時叫停 - 天天要聞

刷醫保可買手錶?一地暫時叫停

近期,不少網友在社交平台上分享了用醫保個人賬戶中的錢購買華為WATCH D2的經歷醫保買單科技產品是否妥當?寧波醫保局已暫時叫停有藥店預約排隊人數超500人近期,有IP地為上海、浙江等地的網友在社交平台上分享經驗——如何利用醫保個人賬戶中的
2024年車企投訴指數排行:比亞迪「遙遙領先」 - 天天要聞

2024年車企投訴指數排行:比亞迪「遙遙領先」

具體來看,榜單TOP10中只有比亞迪和長城汽車的投訴指數分別同比下滑了4.62%、43.12%,其餘8家車企的投訴指數則均處於上漲態勢。尤其是上汽通用五菱,其投訴指數同比顯著上漲超300%,因新車降價、續航里程不準、車身生鏽等問題位列第四名。與之相反的是,一汽
2024年車企十大「關鍵詞」:反向合資 - 天天要聞

2024年車企十大「關鍵詞」:反向合資

俗話說,三十年河東,三十年河西。近年來,中外合資模式發生了反轉。要知道,以往的合資模式是,外資車企出品牌、技術、設備乃至部分零部件,中方車企出土地、資金、人力資源等。現在幾乎成了中方車企出品牌和技術,外資車企投入資金。究其本質還是由於中國新能源車企在智能化與需
松下落日餘暉下的變革:拆解家電版圖,電視業務懸而未決 - 天天要聞

松下落日餘暉下的變革:拆解家電版圖,電視業務懸而未決

本報(chinatimes.net.cn)記者盧曉 北京報道「Panasonic,松下電器」,這句松下家電產品的廣告詞曾在眾多中國家庭的電視中響起,但近年來已經逐漸銷聲匿跡。而在新的2026財年到來前,成立於1918年的日本松下集團對自己曾經的看家業務:家電特別是電視業務,揮起手術刀。繼2月4日宣布將對旗下「松下電器株式會社」進行「發...
繼DeepSeek後,伏羲 - 3憑800倍速度提升,讓老美AI界咋想? - 天天要聞

繼DeepSeek後,伏羲 - 3憑800倍速度提升,讓老美AI界咋想?

在全球AI領域的激烈角逐中,中國的創新力量正不斷掀起巨浪。先是DeepSeek的崛起令世界矚目,如今「伏羲-3」更是橫空出世,以其令人驚嘆的性能震撼了整個行業。「伏羲-3」是由深圳北理莫斯科大學聯合實驗室研發的新型AI訓練框架。
庫班談交易:過去一周很艱難,就像是微軟從win11換成了win10 - 天天要聞

庫班談交易:過去一周很艱難,就像是微軟從win11換成了win10

日前,馬克-庫班在和比爾-蓋茨一同參加的訪談節目中談到了關於東契奇的交易。庫班開玩笑表示:「過去的一周對我來說很艱難,試想若你(蓋茨)離開微軟後,發現鮑爾默將最新的win11熱門系統換成了經典卻有些老的win10系統,你會怎麼想?」此前庫班已賣掉了獨行俠隊的大部分股份(超過35億美元),目前失去了對球隊的決策權。...