a = 'abc' python
理解:①先在內存中生成一個字符串‘abc’函數
②能夠把比變量名a看作一個便利貼,而後將a貼到‘abc’中性能
③注意順序,是生成‘abc’,而後再建立a指向‘abc’spa
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機制。也就是說,值一樣的字符串對象(整數也實用)僅僅會保存一份,是共用的,這也決定了字符串必須是不可變對象。 對象
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。