內(nèi)存管理
1.數(shù)據(jù)的存儲
內(nèi)存分為棧區(qū)間和堆區(qū)間;從底層來看,棧區(qū)間的內(nèi)存的開辟和釋放是系統(tǒng)自動管理的,堆區(qū)間的內(nèi)存是由程序員通過代碼開辟(malloc)和釋放的
從python語言角度,棧區(qū)間的內(nèi)存的開辟和釋放是系統(tǒng)自動管理的,堆區(qū)間的內(nèi)存管理也已經(jīng)封裝好了,
程序員也不需要寫代碼來開辟空間和釋放空間
a.python中變量本身是存在棧區(qū)間的,函數(shù)調(diào)用過程是在棧區(qū)間;所有對象都是存在堆區(qū)間(python中所有數(shù)據(jù)都是對象)
b.變量賦值過程:先在堆區(qū)間開辟空間將數(shù)據(jù)存起來,然后將數(shù)據(jù)對應(yīng)的地址存到棧區(qū)間的變量中。
數(shù)字和字符串比較特殊,賦值的時候不會直接開辟空間,而是先檢測之前有沒有存儲過這個數(shù)據(jù),
如果有就用之前的數(shù)據(jù)的地址
2.內(nèi)存釋放(垃圾回收機制)原理:
python中的每個對象都有一個屬性叫'引用計數(shù)',表示當(dāng)前對象的引用的個數(shù)。判斷一個對象是否銷毀就看對象的引用計數(shù)是否為0;
為0的就銷毀,不為0就不銷毀。
getrefcount函數(shù):
getrefcount(對象) -> 獲取對象的引用計數(shù)
from sys import getrefcount
def main():
list1 = [1, 2]
# 使用不同的變量存對象地址,會增加引用次數(shù)
list2 = list1
print(getrefcount(list1))
list1 = [12, 34]
list1 = []
print(getrefcount(list2))
if __name__ == '__main__':
main()