1. 程式人生 > >1.字符串池化(intern)機制及拓展學習

1.字符串池化(intern)機制及拓展學習

浪費 world 新的 範圍 pri 機制 正常 內存地址 才會

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‘是用來比較前後兩個變量是否根本就是同一對象,也就是指向同一個內存地址。

好吧,不信這個邪,試試用id方法看一下各自的地址。

>> 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)機制及拓展學習