首先我們先來看一個這樣的問題:
1 a = -5
2 b = -5
3 print(a is b) 4
5 c = -6
6 d = -6
7 print(c is d) 8
9 # 輸出結果是?
大多數沒踩過這個坑的小伙伴的答案要么都是True,要么都是False。
但是,,,其真正的結果並不是如此。。。
是不是感覺一臉懵逼???
正確答案是:True 和 False
是不是會在心里說what??? 這不合乎邏輯啊。。。
但是事實就是這樣。
這是由於python的內存優化機制造成的,Python在存儲一些數字的時候,對內存做了相應的優化,導致了兩個變量被賦值為同樣小於-5的數字時,內存地址不一樣,而對於大於-5的數字,其內存地址卻是一樣的。(python認為范圍在[-5,256]的整數的使用對於用戶來說,會在程序中像這樣給變量賦值的次數較多,處於節省內存的考慮,將值在[-5,256]的整數的變量都指向了同一的內存地址,達到節省內存的目的)
* 但是這也和編輯器有關(我在IDLE中測試的范圍為[-5,256]的整數,而在pycharm上測試的范圍為大於-5的整數。
《python源碼剖析》中的解釋:
對於小整數對象,可能在程序中會經常的使用。在python中,所有的對象都存活在系統堆上,如果將這些經常使用的小整數對象也放在系統堆上,python就會經常的在堆上申請空間,釋放空間,會嚴重的影響python的整體性能。
於是,對於小整數對象做了一些改變(優化),python中,對於小整數對象使用了對象池技術,將小整數對象對應的PyIntObject(不可變對象,在對象池中,每一個PyIntobject對象都能被任意的共享)緩存在內存中,並將其指針放在small_ints(小整數對象的對象池)中。