python的大整数对象和小整数对象

* 背景:

a = 300
b = 300
print(a is b)
print(a == b)

如上代码在pycharm和python控制台下分别运行,pycharm显示都是True, 控制台打印第一条为Ture,第二条为False

1. 控制台两条print打印不同原因

  • "is"是身份运算符,判断两个对象内存地址是否相同,内存地址为对象的唯一身份标识,内存地址相同即为同一个对象,比较时使用内置函数id()

  • "=="是比较运算符,比较两个对象的内容是否相同,在python中[-5,256]为小整数,超过256为大整数,所以上述代码才会判断两个对象内容相同但是内存地址不同

  • 打印内存地址可以看出不是同一对象

      >>> print(id(a))
      2297199632176
      >>> print(id(b))
      2297202001072
    

2. 对于大整数对象,pycharm和控制台输出结果不同

  • 控制台每次回车键都是运行了一次,pycharm所有的代码是先加载到内存中在运行,是一个整体,即同一个代码块的大整数对象为同一个对象

    class Test1:
        a = -4
        b = -4
        c = 400
        e = 400
        d = -1234
    
    class Test2:
        a = -4
        c = 400
        d = -1234
    
    t1 = Test1()
    t2 = Test2()
    print(t1.a is t1.b) # True # 同一个代码块中的相同小整数为同一对象
    print(t1.c is t1.e) # True # 同一个代码块中的相同大整数为同一对象
    print(t1.a is t2.a) # True # 不同两个代码块中的相同小整数为同一对象
    print(t1.c is t2.c) # False # 不同两个代码块中的相同大整数内容相同,不是同一对象
    print(t1.d is t2.d)
    

2. python对象的缓冲池机制

  • python所有的内建对象,都有自己特有的缓冲机制

  • python设置[-5,256]为小整数范围,将小整数范围的数缓存在小整数对象池中,在这个范围内的相同整数同为一个对象

    >>> c = 256
    >>> d = 256
    >>> print(id(c))
    1424269392
    >>> print(id(d))
    1424269392
    >>> print(c is d)
    True
    >>> print(c==d)
    True
    
  • 超出小整数范围的即为大整数

posted @ 2020-06-04 16:08  今日店休  阅读(677)  评论(0编辑  收藏  举报