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。