zoukankan      html  css  js  c++  java
  • 1.字符串池化(intern)机制及拓展学习

    1.字符串intern机制

    用了这么久的python,时刻和字符串打交道,直到遇到下面的情况:

    a = "hello"
    b = "hello"
    print(a is b)  #--->True 
    print(a == b)  #---> True
    
    
    a = "hello world"
    b = "hello world"
    print(a is b)  # ---> False
    print(a == b)  # --->True 
    
     

    咦,这是怎么肥事?我们知道 '=='是用来比较两个变量的字面值是否一致,而 'is'是用来比较前后两个变量是否根本就是同一对象,也就是指向同一个内存地址。好吧,不信这个邪,试试用id方法看一下各自的地址。

    >> a = 'hello'
    >>> b = 'hello'
    >>> id(a)
    4482507864
    >>> id(b)
    4482507864
    
    
    >>> a = 'hello world'
    >>> b = 'hello world'
    >>> id(a)
    4482504112
    >>> id(b)
    4482504176

    果然是这样,前面的a,b共用对象了,而后面的a,b的就直接当新对象来处理了。一般来说,新对象建立都会直接开辟一个新的内存使用,但这样的就很容易占用资源,造成内存的浪费,所以python中建立了池化(intern)的概念,即对值相同的字符串对象只会保存一份,相当于共用一个字符串池,当需要值相同的字符串的时候(比如标识符),直接从池里拿来用,避免频繁的创建和销毁,提升效率,节约内存。

    但是并不是所有的字符串都会采用intern机制。只包含下划线、数字、字母的字符串才会被intern。这也就是我们看到的,为什么后面的例子中的a,b还是以新对象来处理了。

    2.整数对象的内存机制

    无独有偶,对于数字这种常用的数据类型,也有这样一种类似机制:

    a = 1
    b = 1
    print(a is b)  # --->True
    print(a == b)  # ---> True
    
    a = 320
    b = 320
    print(a is b)  # --->False
    print(a == b)  # --->True

    难道是个位的整数就是共对象了?也并非如此,python规定了[-5,257)的范围内为小整数池,即这个范围的整数使用时不用再创对象,直接取来用就好。

    而对于大整数还是当作正常对象处理,每次使用均创建⼀个新的对象。

  • 相关阅读:
    git版本超前了N个版本且落后了N个版本的解决办法
    CSS3与动画有关的属性transition、animation、transform对比
    禁止选中文本JS
    页面加载中jquery逐渐消失效果实现
    localstorage和sessionstorage上手使用记录
    点击除元素以外的任意地方隐藏元素js
    js准确获取当前页面url网址信息
    301、404、200、304、500HTTP状态
    对事件委托绑定click的事件的解绑
    RabbitMQ的安装和使用Python连接RabbitMQ
  • 原文地址:https://www.cnblogs.com/robindong/p/9689111.html
Copyright © 2011-2022 走看看