本篇文章為大家帶來了關於Python的相關知識,其中主要介紹了關於CPython的相關問題,CPython的垃圾收集器是Python內建的為了解決循環引用問題的方法,下面一起來看一下,希望對大家有幫助。
【相關推薦:Python3影片教學 】
CPython 中的垃圾收集器
CPython 的垃圾收集器(簡稱GC)是Python 內建的為了解決循環引用問題的方法。預設情況下,它總是在後台運行,並且每隔一段時間就會發揮它的魔力,所以你不必擔心循環引用物會堵塞你的記憶體。
垃圾收集器被設計為從 CPython 的工作記憶體中找到並刪除循環引用物件。它通過以下方式完成這項工作。
偵測循環引用的物件
呼叫最終的__del__ 方法
它從每個物件中刪除指標(以此來解決循環問題),只有當循環在步驟2 之後仍然是孤立的
在這個過程完成後,以前在循環中的每個物件現在的參考計數都是0 ,因此此物件將從記憶體中刪除。
雖然它是自動工作的,但實際上我們可以把它作為一個模組從標準庫中導入。舉例如下:
import gc
偵測循環引用
CPython 的垃圾收集器會追蹤記憶體中存在的各種物件--但不是所有的物件。我們可以實例化一些對象,看看垃圾收集器是否會收集它們。
>>> gc.is_tracked("a string") False >>> gc.is_tracked(["a", "list"]) True
如果一個物件可以包含指針,這就使它有能力形成循環引用結構的一部分--而這正是垃圾檢測器存在的目的,即檢測和拆除。在 Python 中這樣的物件通常被稱為 "容器物件"。
所以,垃圾收集器需要知道任何有可能作為循環參考的一部分而存在的物件。字串不能,所以 "一個字串 "不會被垃圾收集器追蹤。列表(正如我們已經看到的)能夠包含指針,因此 ['a', 'list'] 被追蹤。
使用者定義的類別的任何實例也將被垃圾收集器跟踪,因為我們總是可以在它們身上設定任意的屬性(指標)。
>>> Wade = MyNameClass("Wade") >>> gc.is_tracked(Wade) True
所以,垃圾收集器知道所有有可能形成循環參考的物件。它怎麼知道是否已經形成循環引用呢?
它也知道每個物件中的所有指針,以及它們所指向的位置。我們可以看到這個動作。
>>> my_list = ["a", "list"] >>> gc.get_referents(my_list) ['list', 'a']
get_referents 方法(也稱為遍歷方法)接收一個對象,並傳回它所包含的物件指標的清單(它的參考)。因此,上面的列表包含指向其每個元素的指針,這些元素都是字串。
讓我們在一個物件的循環中看看 get_referents 方法(雖然還不是一個循環引用,因為這些物件仍然可以從命名空間中被存取)。
>>> jane = MyNamedClass("Jane") >>> bob = MyNamedClass("Bob") >>> jane.friend = bob >>> bob.friend = jane >>> gc.get_referents(bob) [{'name': 'bob', 'friend': <__main__.MyNamedClass object at 0x7ff29a095d60>}, <class '__main__
在這個循環中,我們可以看到由bob 指向的物件包含指向以下內容的指標:它的屬性字典,包含bob 的名字(bob) 和它的朋友(同樣由jane 指向的MyNamedClass 實例) 。 bob 物件也有一個指向類別物件本身的指針,因為 bob.class 將會傳回那個類別物件。
當垃圾收集器運行時,它檢查它所知道的每個物件(也就是當你呼叫 gc.is_tracked 時傳回True的任何物件)是否可以從命名空間到達。它透過追蹤來自命名空間的所有指針,以及這些指針所指向的物件中的指針,以此類推,直到它建立起所有可從程式碼中存取的東西的整個視圖。
如果在做完這些之後,GC 發現存在一些無法從命名空間到達的對象,那麼它可以把這些物件清除掉。
記住,任何仍在記憶體中的物件必須有一個非零的參考計數,否則它們會因為引用計數而被刪除。對於那些無法到達但仍有非零引用計數的對象,它們必須是循環引用的一部分,這就是為什麼我們如此關心這些發生的可能性。
讓我們回到引用循環,jane 和 bob,透過從命名空間中移除指針,把這個循環變成一個循環的隔離。
>>> del jane >>> del bob
現在,我們已經了解了垃圾收集器所要解決的確切情況。我們可以透過呼叫 gc.collect() 來觸發手動垃圾收集。
>>> gc.collect() Deleting Bob! Deleting Jane! 4
預設情況下,垃圾收集器會每隔一段時間自動執行這個動作(因為越來越多的物件在CPython運行時被創建和銷毀)。
在上面的程式碼片段中,我們看到的輸出包含了來自 MyNamClass 的 __del__ 方法的列印語句,在最後有一個數字--在這個例子中,是 4。這個數字是由垃圾收集器本身輸出的,它告訴我們有多少物件被移除。
【相關推薦:Python3影片教學 】
以上是一文了解CPython中的垃圾收集器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

要在有限的時間內最大化學習Python的效率,可以使用Python的datetime、time和schedule模塊。 1.datetime模塊用於記錄和規劃學習時間。 2.time模塊幫助設置學習和休息時間。 3.schedule模塊自動化安排每週學習任務。

Python在遊戲和GUI開發中表現出色。 1)遊戲開發使用Pygame,提供繪圖、音頻等功能,適合創建2D遊戲。 2)GUI開發可選擇Tkinter或PyQt,Tkinter簡單易用,PyQt功能豐富,適合專業開發。

Python适合数据科学、Web开发和自动化任务,而C 适用于系统编程、游戏开发和嵌入式系统。Python以简洁和强大的生态系统著称,C 则以高性能和底层控制能力闻名。

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

兩小時內可以學到Python的基礎知識。 1.學習變量和數據類型,2.掌握控制結構如if語句和循環,3.了解函數的定義和使用。這些將幫助你開始編寫簡單的Python程序。

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。