python記憶體動態分配過程詳解

2022-10-04 16:54:13 字數 1966 閱讀 8656

一、前言

大多數編譯型語言,變數在使用前必須先宣告,其中c語言更加苛刻:變數宣告必須位於**塊最開始,且在任何其他語句之前。其他語言,想c++和j**a,允許「隨時隨地」宣告變數,比如,變數宣告可以在**塊的中間,不過仍然必須在變數被使用前聲yzpsk明變數的名字和型別。

在python中,無序此類顯式變數宣告www.cppcns.com語句,變數在第一次被賦值時自動宣告。和其他大多數語言一樣,變數只有被建立和賦值後才能被使用。

# 變數未宣告

>>> x

traceback (most recent call last):

file "", line 1, in

nameerror: name 'x' is not defined

#變數一旦被賦值,就可以通過變數名來訪問它

>>> x=1

>>> y="it's wonderful."

>>> x

1>>> y

"it's wonderful."

二、動態型別

python中不但變數名無需事先宣告,而且也無需型別宣告。在python語言中,物件的型別和記憶體占用都是執行時確定的。儘管**被編譯成位元組碼,python仍然是一種解釋型語言。在賦值時直譯器會根據語法和右側的運算元來決定新物件的型別。在物件建立後,乙個該物件的應用會被賦值給左側的變數。

三、記憶體分配

作為乙個負責任的程式設計師,我們知道在為變數分配記憶體時,是在借用系統資源,在用完之後,應該釋放借用的系統資源。python直譯器承擔了記憶體管理的複雜任務,這大大簡化了應用程式的編寫。

3.1 引用計數

要保持追蹤記憶體中的物件,python使用了引用計數這一簡單技術。也就是說python內部記錄著所有使用中的物件 各有多少引用。乙個內部跟蹤變數,稱為引用計數器。每個物件各有多少個引用,簡稱引用計數。當物件被建立時,就建立了乙個引用計數,當這個物件不再需要時,也就是說,這個物件的引用計數變為0時,它被垃圾**。(並不是100%這樣)

3.2 增加引用計數

當物件被建立並賦值給變數時,該物件的引用計數就被設定為1。

當同乙個變數又被賦值給其他變數時,或作為引數傳遞給函式、方法或類例項,或者被賦值為乙個視窗物件的成員時,該物件的乙個新的引用,或者稱為別名,就被建立(則該物件的引用計數就程式設計客棧自動加1)。

如下**:  

>>> x = 3

>>> y = x

語句x=3我們將3賦值給x。x是第乙個引用,因此,該物件的引用計數被設定為1。語句y=x建立了乙個指向同一物件的別名y。事實上並沒有為y建立乙個新的物件,而是該物件的引用計數增加了一次(變成了2)。這是物件引用計數增加的方式之一。還有一些其他的方式也能增加物件的引用計數,比如該物件作為引數被函式呼叫或這個物件被加入到某個列表等物件當中。

總之,物件的引用計數增加是:

3.3 減少引用計數

當物件的引用被銷毀時,引用計數會減小。最明顯的例子就是當引用離開其作用範圍時,這種情況最經常出現在函式執行結束時,所有的區域性變數都被自動銷毀,物件的引用計數也就隨之減少。

當變數被賦值給另外乙個物件時,原物件的引用計數也會自動減1:

>>yzpsk;> foo = 'xyz'

>>> bar = foo

>>> foo = 123

當字串物件「xyz」被建立並賦值給foo時,它的引用計數是1。當增加乙個別名bar時,引用計數變成了2。不過當foo被重新賦值給整型物件123時,xyz物件的引用計數自動減1,又重新變成了1。

其他造成物件引用計數減少的方式包括使用del語句刪除乙個變數,或者當乙個物件被移出乙個視窗物件時。

物件引用計數減少的情況:

四、垃圾收集

不再使用的記憶體會被一種稱為垃圾收集的機制釋放。像上面說的,雖然直譯器跟蹤物件的引用計數,但垃圾收集器負責釋放記憶體。垃圾收集器是一塊獨立**,它用來尋找計數為0的物件它也負責檢查那些雖然引用計數大於0但也應該被銷毀的物件。特定情形會導致迴圈引用。

本文標題: python記憶體動態分配過程詳解

本文位址:

記憶體動態分配

陣列的元素儲存於記憶體中連續的位置上。當乙個陣列被宣告時,它所需要的內存在編譯時就被分配。但是,你也可以使用動態記憶體分配在執行時為它分配記憶體。malloc所分配的是一塊連續的記憶體。例如,如果請求它分配100個位元組的記憶體,那麼它實際分配的記憶體就是100個連續的位元組,並不會分開位於兩塊或多...

動態分配記憶體

動態記憶體分配即分配記憶體大小在執行時才確定,一般在堆中分配。c語言動態記憶體分配相關的函式。include void malloc size t size malloc的使用比較直接,乙個成功的malloc呼叫返回分配的size大小的記憶體的指標。失敗時返回null並將錯誤 置為enomem。教材...

動態分配記憶體

動態分配記憶體 動態分配記憶體也可以分配儲存區,這種方式可以在程式執行的時候臨時決定分配的儲存區大小 為了管理動態分配的記憶體,就需要使用一組標準函式 為了使用這些標準函式,需要包含stdlib.h標頭檔案 malloc 函式可以動態分配一組連續的位元組 這個函式需要乙個整數型別引數表示分配的位元組...