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。

相关文章
相关标签/搜索