zoukankan      html  css  js  c++  java
  • Python变量的本质与intern机制

    变量的存储

      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。

  • 相关阅读:
    condition精准控制
    Juc(上)
    算法和空间复杂度分析
    ReentrantLock
    死锁
    互斥锁
    线程常用方法
    多线程售票与同步机制
    线程的7种状态
    selenium 自动刷司法课
  • 原文地址:https://www.cnblogs.com/yc3110/p/10451918.html
Copyright © 2011-2022 走看看