zoukankan      html  css  js  c++  java
  • 对Python的 ‘==‘ 和 ‘is‘的理解,希望对你有帮助

    '==' 比较的是两个对象的值

    'is' 比较的是两个对象的内存地址(id)

    下面我们着重理解 'is'。对于这个,我们需要知道:小整数对象池,大整数对象池,以及intern机制

    小整数池:Python预先创建小整数缓存池—— [-5~256],无论创建多少个对象,都是指向同一个地址,这样是为了避免小整数频繁申请和释放内存。

    >>> a=3
    >>> b=3
    >>> a is b
    True
    >>> 1+2 is 3
    True
    
    >>> a=1.0
    >>> b=1.0
    >>> a is b
    False
    

    大整数对象池:Python 提供了一个可扩展的内存空间,也叫通用整数对象池,谁需要用就给谁用,免去了申请内存。这个空间是一个PyIntBlock结构,是用一个单向列表连接一串内存(block),这个列表由 block_list 维护,而每个 block 维护一个 整数对象数组(Objects),用于存放被缓存的整数对象,即处于一个内存(block)的大整数是同一个对象。

    '''
    遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    >>> def func():
    ...     a=10.1
    ...     b=10.1
    ...     return a is b
    ...
    >>> func()
    True
    

    a和b的赋值都是由同一个通用整数池项获得的。

    intern机制:Python的字符串类型中有一个 interned,它是一个记录字符串对象的字典,以此来保证这些字符串在内存中的唯一,相同值的字符串会使用同一个对象。

    但是,只对由字母、数字、下划线组成的字符串做intern处理,而存在其他字符的字符串则不会。

    >>> a='abc'
    >>> b='abc'
    >>> a is b
    True
    
    >>> a='ab c'
    >>> b='ab c'
    >>> a is b
    False
    

    此外,Python其他的数据类型如字典(dict)、列表(list)、集合(set)等,都是创建不同的对象

    >>> a=[1,2,3]
    >>> b=[1,2,3]
    >>> a is b
    False>>> a={'a':1}>>> b={'a':1}>>> a is bFalse>>>
    

    补充一个,下面这种情况是因为上一个 [1,2,3]被回收了,在新建[4,5,6]时那片缓存又被用到了

    >>> id([1,2,3]) == id([4,5,6])
    True
    >>> id([1,2,3])
    36200264L
    >>> id([4,5,6])
    36200264L
    

    转自:https://blog.csdn.net/sinat_38682860/article/details/107956412

  • 相关阅读:
    现代程序设计——homework-01
    数据结构 学习笔记03——栈与队列
    MCI 函数与命令
    mciSendString用法
    VC6.0 error LNK2001: unresolved external symbol _main解决办法
    数据结构 学习笔记02——线性表
    数据结构 学习笔记01
    《windows程序设计》学习_4:文本输出,加滚动条
    浅析指针(pointer)与引用(reference)
    指针数组 | 数组指针
  • 原文地址:https://www.cnblogs.com/djdjdj123/p/13491481.html
Copyright © 2011-2022 走看看