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

1.字符串intern機制

用了這麼久的python,時刻和字符串打交道,直到遇到下面的狀況: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方法看一下各自的地址。spa

>> 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)的概念,即對值相同的字符串對象只會保存一份,至關於共用一個字符串池,當須要值相同的字符串的時候(好比標識符),直接從池裏拿來用,避免頻繁的建立和銷燬,提高效率,節約內存。code

可是並非全部的字符串都會採用intern機制。只包含下劃線、數字、字母的字符串纔會被intern。這也就是咱們看到的,爲何後面的例子中的a,b仍是以新對象來處理了。對象

2.整數對象的內存機制

無獨有偶,對於數字這種經常使用的數據類型,也有這樣一種相似機制:blog

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)的範圍內爲小整數池,即這個範圍的整數使用時不用再創對象,直接取來用就好。內存

而對於大整數仍是看成正常對象處理,每次使用均建立⼀個新的對象。資源

相關文章
相關標籤/搜索