小整數對象池 (在python內置了)
整數在程序中的使用非常廣泛,Python為了優化速度,使用了小整數對象池,避免為整數頻繁申請和銷毀內存空間。
Python對小整數的定義是[-5,257]這些整數對象是提前建立好的,不會被垃圾回收。在一個Python的程序中,所有位於這個范圍內的整數使用的都是同一個對象。
同理,單個字母也是這樣的。
但是當定義2個相同的字符串時,引用計數為0,觸發垃圾回收
intern機制
a1="helloworld"
a2="helloworld"
a3="helloworld"
a4="helloworld"
a5="helloworld"
a6="helloworld"
a7="helloworld"
a8="helloworld"
a9="helloworld"
python會不會創建9個對象呢?在內存中會不會開辟9個"helloworld"的內存空間呢?想一下,如果是這樣的話,我們寫10000個對象,
那他豈不是開辟了10000個helloworld所占的內存空間了呢?如果真這樣,內存不就爆了嗎?所以python中有這樣一個機制-----intern
機制,讓他只占用一個"helloworld"所占的內存空間。靠引用計數去維護何時釋放。
a="hello"
b="hello"
id(a)
4555765776
id(b)
4555765776
a = "hello world"
b = "hello world"
id(a)
4553372528
id(b)
4555786352
python默認只會對由字符"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"構成字符串進行intern。
如果是
a = '!@#'
b= '!@#'
id(a)
45517120id(b)
45517216