十三、python基礎:變量的作用域1(內存引用和釋放)

十三、python基礎:變量的作用域1(內存引用和釋放)

在談到變量的作用域之前,我們先對python解釋器運行時代碼的執行順序、內存分配、內存引用、內存釋放機制先了解一下。

1、運行一個py文件時,python解釋器是怎麼工作的?

在pycharm運行一個py文件時,我們右鍵點擊run,它就會執行。這時候,python解釋器是從上往下一行一行地解釋翻譯成機器碼。
我們以下面這個例子來說明一下:

i = 0
def add(a, b=1):
    i += a
    
add(1)
print(i)

這個例子沒什麼具體的意義,但可以分析一下解釋器怎麼運行的。
當你右鍵運行時,解釋器從上往下掃描代碼,遇到i=0,就在內存空間開闢一個地方,存放i對應的值。繼續往下看到定義了函數add,這時候它不會調用函數的,它會先看到函數內部還有一個默認參數b=1,又開闢了一塊內存來存放b的值。繼續往下看到了調用add函數,於是它返回去把這函數調用一遍,最後看到調用了print函數,就輸出在控制檯。輸出結束時,整個文件的執行就結束了,原先存放在內存中的各個變量就釋放出來了。

這整個流程我們就大致清楚了。

但需要注意的是:內存引用機制的幾個相關問題

1、怎麼知道變量存在內存中的哪裏?

我們可以使用id(a),來獲得變量a存放的內存地址。

2、對一個變量重新賦值的過程中,解釋器是否會重新開闢內存空間給它;

會的。
在這裏插入圖片描述
這裏可以看到,2次對同一個變量a重新賦值,它的內存地址改變了。說明解釋器重新開闢了內存空間給這個變量使用。

3、對一個變量進行修改時,解釋器是在原地址進行修改,還是給它修改後存放到一個新的內存空間;

這個要看變量是什麼類型的,執行的修改操作是什麼。
這個問題比較複雜些。我在做項目過程中有遇到過這個問題,如果有興趣可以看我另一篇文章:
python的大坑:使用空列表作爲默認參數,讓我懷疑遇到了靈異代碼

裏面還有講到django框架在內存釋放上的問題,跟你單獨執行一個py文件,是不一樣的。

最後,涉及內存方面的問題,我這裏講得不是很多,但新手知道這些基本差不多了,想知道更多的話,可以搜索一下別人的文章。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章