思考 : 當變數值命名以及生成的時候, 會在**儲存著呢 ?
x = 10
當我們在p1.py中定義乙個變數x = 10
,那麼計算機把這個變數值10存放在**呢了?我們回顧計算機的三大核心元件為:cpu、記憶體和硬碟。一定不是cpu,那是存放在記憶體還是硬碟中了呢?我們再回顧變數執行的三個過程,如果我們沒有使用python直譯器執行p1.py這個檔案,那麼x=10
很明顯只是很普通的四個字元x、=、1、0。而只有python直譯器執行了這個檔案,那字元進入了記憶體,才會有變數這個概念。也就是說變數是存放在記憶體當中的。
變數存放在記憶體中這句話太寬泛了,我們把它具體化。現在想象我們在學校(電腦記憶體)裡上課,學校每開乙個班,學校都會開闢乙個教室給這個班級上課用(存放變數值10),而班級的門牌號則是(變數名x)。也就是說,對於電腦記憶體這個大記憶體,每定義乙個變數就會在這個大記憶體中開闢乙個小空間,小空間內存放變數值10,然後記憶體給這個小空間乙個變數名x(門牌號),x指向10。
對於p1.py,如果我們再加上一段**x = 11
,大記憶體會開闢另乙個小空間儲存變數值11,把變數值繫結另乙個門牌號x,但是由於之前有x,所以大記憶體會解除x與10的連線,讓x與11連線。這個時候10由於沒有了門牌號,所以成為了python眼中的垃圾,python就會處理這個垃圾,釋放10的記憶體占用,這就是python的垃圾**機制。而其他語言需要手動把10的記憶體占用釋放掉。
從上述的解釋我們可以知道只要某個變數值繫結著門牌號,就不是垃圾,反之變數值沒有繫結著門牌號,這個變數值就是垃圾,python就會自動清理這個垃圾。這裡我們對於這個門牌號給定乙個專業的解釋,在python中這個門牌號被稱作引用計數。
x = 10 # 10引用計數加1為1
y = x # 10引用計數加1為2
x = 11 # 10引用計數減1為1;11引用計數加1為1
del y # 10引用計數減1為0,觸發python垃圾**機制,python清理10的記憶體占用
上述**就是乙個引用計數加減的過程。
對於上一節講的引用計數,需要注意的是:python實現int的時候有個小整數池。為了避免因建立相同的值而重複申請記憶體空間所帶來的效率問題, python直譯器會在啟動時建立出小整數池,範圍是[-5,256],該範圍內的小整數物件是全域性直譯器範圍內被重複使用,永遠不會被垃圾**機制**。
在pycharm中執行python程式時,pycharm出於對效能的考慮,會擴大小整數池的範圍,其他的字串等不可變型別也都包含在內一便採用相同的方式處理了,我們只需要記住這是一種優化機制,至於範圍到底多大,無需細究。
Python變數記憶體管理
目錄變數 描述世間萬物的狀態 在申請變數的時候,會在記憶體中申請記憶體空間,變數值是存在於記憶體中的。乙個變數,記憶體就開闢乙個記憶體空間儲存這個變數。比如 x 10當我們在p1.py中定義乙個變數x 10,那麼計算機把這個變數值10存放在 呢了?我們回顧計算機的三大核心元件為 cpu 記憶體和硬碟...
009 Python變數記憶體管理
目錄 三 小整數池 x 10變數存放在記憶體中這句話太寬泛了,我們把它具體化。對於電腦記憶體這個大記憶體,每定義乙個變數就會在這個大記憶體中開闢乙個小空間,小空間內存放變數值10,然後記憶體給這個小空間乙個變數名x 門牌號 x指向10。對於p1.py,如果我們再加上一段 x 11,大記憶體會開闢另乙...
019 Python變數記憶體管理
目錄 三 小整數池 x 10當我們在p1.py中定義乙個變數x 10,那麼計算機把這個變數值10存放在 呢了?我們回顧計算機的三大核心元件為 cpu 記憶體和硬碟。一定不是cpu,那是存放在記憶體還是硬碟中了呢?我們再回顧變數執行的三個過程,如果我們沒有使用python直譯器執行p1.py這個檔案,...