In [1]:
name = 'admin'
print("name=", name)
name1 = name
print("name1=", name1)
In [2]:
name2 = 'admin'
print("name2=", name2)
In [3]:
print(id(name), name)
print(id(name1), name1)
print(id(name2), name2)
In [4]:
name2 = name
print(name == name2)
print(id(name) == id(name2))
In [5]:
name2 = "admin1"
print(id(name), name)
print(id(name2), name2)
print(name == name2)
print(id(name) == id(name2))
上面兩塊代碼驗證了在python系統中,變量會共用相同的值的內存。
1.當name2的值與name的值為“admin”時,name2與name對象的內存地址相同。
2.當name2的值改變為“admin1”時,name2對象的內存地址將會改變了¶
Python的內存管理主要有三種機制:引入計數機制、垃圾回收機制和內存池機制。
引入技術機制:在python內部,通過引入技術來保持追蹤內存中的對象,python內部記錄對象有多少個引用,即引用計數,當對象被創建使就創建一個引用計數,當對象不再需要時,這個對象的引用計數為0時,它將被垃圾回收。
垃圾回收機制:當內存中不再使用該內存部分時,垃圾收集器就會把它們清理掉。它會去檢查引用計數為0的對象,然后清除其所在的內存的空間。
內存池機制:在Python中,許多時候申請的內存都是小塊的內存,這些小塊內存在申請后,很快又會被釋放,由於這些內存的申請並不是為了創建對象,所以並沒有對象一級的內存池機制。這就意味着Python在運行期間會大量地執行malloc和free的操作,頻繁地在用戶態和核心態之間進行切換,這將嚴重影響Python的執行效率。為了加速Python的執行效率,Python引入了一個內存池機制,用於管理對小塊內存的申請和釋放。內存池的概念就是預先在內存中申請一定數量的,大小相等的內存塊留作備用,當有新的內存需求時,就先從內存池中分配內存給這個需求,不夠了之后再申請新的內存。這樣做最顯著的優勢就是能夠減少內存碎片,提升效率。內存池的實現方式有很多,性能和適用范圍也不一樣。
下面通過三個步驟分析內存管理和釋放的過程:
In [6]:
name2 = 'admin1'
In [7]:
name1 = name2
print(id(name1), name1)
print(id(name2), name2)
print(id(name), name)
In [8]:
name = 'admin1'
print(id(name1), name1)
print(id(name2), name2)
print(id(name),name)
In [9]:
name = 'admin'
print(id(name1), name1)
print(id(name2), name2)
print(id(name),name)