1. 程式人生 > 遊戲攻略 >《原神攻略》金蘋果群島第二階段水泡位置一覽

《原神攻略》金蘋果群島第二階段水泡位置一覽

ython作為一門解釋型語言,以程式碼簡潔易懂著稱。我們可以直接對名稱賦值,而不必宣告型別。名稱型別的確定、記憶體空間的分配與釋放都是由python直譯器在執行時進行的。python這一自動管理記憶體功能極大的減小了程式設計師負擔,這也是成就python自身的重要原因之一。

Python的垃圾回收機制

一、引用計數

Python中,主要通過引用計數(Reference Counting)進行垃圾回收。

typedef struct_object {
 int ob_refcnt;
 struct_typeobject *ob_type;
} PyObject;

在Python中每一個物件的核心就是一個結構體PyObject,它的內部有一個引用計數器(ob_refcnt)。程式在執行的過程中會實時的更新ob_refcnt的值,來反映引用當前物件的名稱數量。當某物件的引用計數值為0,那麼它的記憶體就會被立即釋放掉。
以下情況是導致引用計數加一的情況:

  • 物件被建立,例如a=2
  • 物件被引用,b=a
  • 物件被作為引數,傳入到一個函式中
  • 物件作為一個元素,儲存在容器中
    下面的情況則會導致引用計數減一:
  • 物件別名被顯示銷燬 del
  • 物件別名被賦予新的物件
  • 一個物件離開他的作用域
  • 物件所在的容器被銷燬或者是從容器中刪除物件
    我們還可以通過sys包中的getrefcount()來獲取一個名稱所引用的物件當前的引用計數(注意,這裡getrefcount()本身會使得引用計數加一)
sys.getrefcount(a)

引用計數法有其明顯的優點,如高效、實現邏輯簡單、具備實時性,一旦一個物件的引用計數歸零,記憶體就直接釋放了。不用像其他機制等到特定時機。將垃圾回收隨機分配到執行的階段,處理回收記憶體的時間分攤到了平時,正常程式的執行比較平穩。但是,引用計數也存在著一些缺點,通常的缺點有:

  • 邏輯簡單,但實現有些麻煩。每個物件需要分配單獨的空間來統計引用計數,這無形中加大的空間的負擔,並且需要對引用計數進行維護,在維護的時候很容易會出錯。
  • 在一些場景下,可能會比較慢。正常來說垃圾回收會比較平穩執行,但是當需要釋放一個大的物件時,比如字典,需要對引用的所有物件迴圈巢狀呼叫,從而可能會花費比較長的時間。
  • 迴圈引用。這將是引用計數的致命傷,引用計數對此是無解的,因此必須要使用其它的垃圾回收演算法對其進行補充。
    也就是說,Python 的垃圾回收機制,很大一部分是為了處理可能產生的迴圈引用,是對引用計數的補充。