在Python種,一切皆是對象。對象的存儲放在堆內存中。
1、內存表(memory table)和變量表(variable table)
在Python中內存使用內存表來表示。內存表告訴我們數據在堆內存中的地址。我們通常使用變量(數據的引用,即地址)來指向數據。如下圖所示:
變量 n
指向的內存地址爲 2000
,內存地址 2000
所對應的值爲 42
。同理可得 greet
變量的值爲 hello
。
我們可以使用 id()
函數來查看一個對象的唯一標識,相當於人的身份證號碼一樣。Python解釋器有很多種,例如 CPython、IPython、PyPy、Jython、IronPython
。不同的解釋器對 id()
函數的實現方式不一樣。CPython
中id()
函數使用對象的地址來唯一標識一個對象。
在 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()
每次一個函數被調用,該函數都會創建一個與之對應的局部變量表。該函數調用結束之後,對應的局部變量表也會被丟棄。
全局變量表有函數 g
和 change_list
以及 字符串名字 __name__
。函數 g
中 L = [1,2,3]
被執行後,內存表、全局變量表,局部變量表如下圖所示:
調用 change_list
時,L
和 L1
指向相同的內存,L1[0] = 4
修改對應內存空間的值爲4,如下圖所示:
當執行 L1 = [3,2,1]
時,會創建一個新的 List,如下圖所示:
當 change_list
執行完畢後,對應的局部變量表會被丟棄,如下圖所示:
所以,最後的輸出爲:[4, 2, 3]
PS:字符串的存儲和List的存儲類似。