变量的存储
a = 'abc'
理解:①先在内存中生成一个字符串‘abc’
②可以把比变量名a看做一个便利贴,然后将a贴到‘abc’中
③注意顺序,是生成‘abc’,然后再创建a指向‘abc’
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__() 在判断==方法时,会调用此函数,如果此函数返回值一样,则判断==成立。
python的intern机制
由于变量的存储机制,python增加了字符串的intern机制。也就是说,值同样的字符串对象(整数也实用)仅仅会保存一份,是共用的,这也决定了字符串必须是不可变对象。
a = 'opq'
b = 'o' + 'pq'
id(a)
66832910
>>> id(b)
66832910
intern机制
优点:在创建新的字符对象时,如果内存中已经存在,则直接引用,避免频繁的创建和销毁内存,提升效率。
缺点:在拼接字符串时,或者在改动字符串时会极大的影响性能。原因是字符串在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。