Python內存模型

在Python種,一切皆是對象。對象的存儲放在堆內存中。

1、內存表(memory table)和變量表(variable table)

在Python中內存使用內存表來表示。內存表告訴我們數據在堆內存中的地址。我們通常使用變量(數據的引用,即地址)來指向數據。如下圖所示:
在這裏插入圖片描述
變量 n 指向的內存地址爲 2000,內存地址 2000 所對應的值爲 42。同理可得 greet 變量的值爲 hello

我們可以使用 id() 函數來查看一個對象的唯一標識,相當於人的身份證號碼一樣。Python解釋器有很多種,例如 CPython、IPython、PyPy、Jython、IronPython 。不同的解釋器對 id() 函數的實現方式不一樣。CPythonid() 函數使用對象的地址來唯一標識一個對象。

在 python 中 is 用來查看兩個對象是否是同一個,即查看的是對象的內存地址是否相同。而 == 查看的是對象的值是否相同。

>>> a=-6
>>> b=-6
>>> a is b
False
>>> a=-5
>>> b=-5
>>> a is b
True
>>> a=255
>>> b=255
>>> a is b
True
>>> a=256
>>> b=256
>>> a is b
True
>>> a=257
>>> b=257
>>> a is b
False
>>> a='a'
>>> b='a'
>>> a is b
True
>>>

Python解釋器啓動的時候 [-5,256] 之間的數,以及 a-z、A-Z 之間的字符都會事先在內存中設置好。以提高利用效率。如下圖所示:

在這裏插入圖片描述
執行:

a=2
b=2

後,變量表爲:
在這裏插入圖片描述
再執行:

c=a

後,變量表爲:
在這裏插入圖片描述

2、List 的存儲

執行:

list0 = [2, 4]

後,內存表和變量表爲:
在這裏插入圖片描述
繼續執行:

list1=list0
list0[0]=3

後,內存表和變量表爲:
在這裏插入圖片描述

3、函數和局部變量表

假設有如下代碼:

def change_list(L1):
    L1[0] = 4
    L1 = [3,2,1]
def g():
	L = [1,2,3]
	change_list(L)
	print(L)
if __name__ == ’__main__’:
	g()

每次一個函數被調用,該函數都會創建一個與之對應的局部變量表。該函數調用結束之後,對應的局部變量表也會被丟棄。

全局變量表有函數 gchange_list 以及 字符串名字 __name__ 。函數 gL = [1,2,3] 被執行後,內存表、全局變量表,局部變量表如下圖所示:
在這裏插入圖片描述
調用 change_list 時,LL1 指向相同的內存,L1[0] = 4 修改對應內存空間的值爲4,如下圖所示:
在這裏插入圖片描述
當執行 L1 = [3,2,1] 時,會創建一個新的 List,如下圖所示:
在這裏插入圖片描述
change_list 執行完畢後,對應的局部變量表會被丟棄,如下圖所示:
在這裏插入圖片描述
所以,最後的輸出爲:[4, 2, 3]

PS:字符串的存儲和List的存儲類似。

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