用了這麼久的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仍是以新對象來處理了。對象
無獨有偶,對於數字這種經常使用的數據類型,也有這樣一種相似機制: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)的範圍內爲小整數池,即這個範圍的整數使用時不用再創對象,直接取來用就好。內存
而對於大整數仍是看成正常對象處理,每次使用均建立⼀個新的對象。資源