Python變量的本質與intern機制

變量的存儲

  a = 'abc' python

理解:①先在內存中生成一個字符串‘abc’函數

   ②能夠把比變量名a看作一個便利貼,而後將a貼到‘abc’中性能

      ③注意順序,是生成‘abc’,而後再建立a指向‘abc’spa

python的is 和==的區別

is用來判斷兩個對象的ID是否同樣

a = [1,3,4,5]
b = [1,3,4,5]
print(a == b)
print(a is b)
True
False

  上述代碼中之因此a == b成立,是由於a是一個list類型,list類型中實現了魔法函數__eq__() 在判斷==方法時,會調用此函數,若是此函數返回值同樣,則判斷==成立。
code

python的intern機制

因爲變量的存儲機制,python增長了字符串的intern機制。也就是說,值一樣的字符串對象(整數也實用)僅僅會保存一份,是共用的,這也決定了字符串必須是不可變對象。 對象

a = 'opq'
b = 'o' + 'pq'
id(a)
66832910
>>> id(b)
66832910

intern機制blog

  優勢:在建立新的字符對象時,若是內存中已經存在,則直接引用,避免頻繁的建立和銷燬內存,提高效率。內存

  缺點:在拼接字符串時,或者在改動字符串時會極大的影響性能。緣由是字符串在Python當中是不可變對象,因此對字符串的改動不是inplace(原地)操做,須要新開闢內存地址,新建對象。字符串

 注意一:

intern機制僅僅對那些看起來像是Python標識符的字符串對象纔會觸發。編譯

a = 'hello world'
b = 'hello world'
 id(a)
66834385
id(b)
66439216

 此代碼中由於字符串中加入了‘ ’因此不會觸發intern機制。

注意二:

 'op' + 'q' is 'opq'
True  

c = 'op'
d = 'opq'
c + 'q' is 'opq'
False

在第一個例子中,‘op’ + ‘q’是在compile-time(編譯時)求值的,被替換成了’opq’,而在第二個例子中,c + ‘q’是在run-time(運行時)拼接的,致使沒有被主動intern。

相關文章
相關標籤/搜索