1.字符串池化(intern)機制及拓展學習
阿新 • • 發佈:2018-09-22
浪費 world 新的 範圍 pri 機制 正常 內存地址 才會 好吧,不信這個邪,試試用id方法看一下各自的地址。
,即這個範圍的整數使用時不用再創對象,直接取來用就好。
1.字符串intern機制
用了這麽久的python,時刻和字符串打交道,直到遇到下面的情況:
a = "hello" b = "hello" print(a is b) #--->True print(a == b) #---> True a = "hello world" b = "hello world" print(a is b) # ---> False print(a == b) # --->True
咦,這是怎麽肥事?我們知道 ‘==‘是用來比較兩個變量的字面值是否一致,而 ‘is‘是用來比較前後兩個變量是否根本就是同一對象,也就是指向同一個內存地址。
>> a = ‘hello‘ >>> b = ‘hello‘ >>> id(a) 4482507864 >>> id(b) 4482507864 >>> a = ‘hello world‘ >>> b = ‘hello world‘ >>> id(a) 4482504112 >>> id(b) 4482504176
果然是這樣,前面的a,b共用對象了,而後面的a,b的就直接當新對象來處理了。一般來說,新對象建立都會直接開辟一個新的內存使用,但這樣的就很容易占用資源,造成內存的浪費,所以python中建立了池化(intern)的概念,即對值相同的字符串對象只會保存一份,相當於共用一個字符串池,當需要值相同的字符串的時候(比如標識符),直接從池裏拿來用,避免頻繁的創建和銷毀,提升效率,節約內存。
但是並不是所有的字符串都會采用intern機制。只包含下劃線、數字、字母的字符串才會被intern。這也就是我們看到的,為什麽後面的例子中的a,b還是以新對象來處理了。
2.整數對象的內存機制
無獨有偶,對於數字這種常用的數據類型,也有這樣一種類似機制:
a = 1 b = 1 print(a is b) # --->True print(a == b) # ---> True a = 320 b = 320 print(a is b) # --->False print(a == b) # --->True
難道是個位的整數就是共對象了?也並非如此,python規定了[-5,257)的範圍內為小整數池
而對於大整數還是當作正常對象處理,每次使用均創建?個新的對象。
1.字符串池化(intern)機制及拓展學習