小和大整数对象池以及is与==的区别

小整数对象池

在实际的编程中,数值比较小的整数,比如1、2、29等,可能在程序中会非常频繁地使用。在Python中,所有的对象都是存活在系统堆上。这就是说,如果没有特殊的机制,对于这些频繁使用的小整数对象,Python将一次又一次地使用malloc在对上申请空间,并且不厌其烦地一次次free。这样的操作不仅大大降低了运行效率,而且会在系统对造成大量的内存碎片,严重影响Python的整体性能。因此对于小整数对象使用了对象池技术。设置小整数的范围为[-5,256]。在这个范围内的小整数,任意相同的整数都是同一个对象。

  • 小整数的缓冲池是在Python初始化的时候被创建的。

例:

# 测试左边界:-5
>>> a = -5
>>> b = -5
>>> id(a)
1449290592
>>> id(b)
1449290592
>>> a is b
True    # 说明在小整数范围内,数值相同的对象是同一个对象
>>>
 
# 测试超出左边界的值
>>> a = -6
>>> b = -6
>>> id(a)
2524207766064
>>> id(b)
2524207765904
>>> a is b
False    # 说明不在小整数范围内,数值相同的对象是不同的对象
>>>
 
# 测试右边界
>>> a = 256
>>> b = 256
>>> id(a)
1449298944
>>> id(b)
1449298944
>>> a is b
True
>>>
 
# 测试超出右边界的值
>>> a = 257
>>> b = 257
>>> id(a)
2524207766000
>>> id(b)
2524207765904
>>> a is b
False
>>>
  • 大整数对象池
    超出小整数的范围即为大整数,每次都会创建一个新的对象。但是处于一个代码块的大整数是同一个对象。(具体看下面的代码演示)
>>> class A(object):  # 创建类A,在A里面定义4个整数对象
...     a = 100
...     b = 100
...     c = 1000
...     d = 1000
...
>>> class B(object):  # 创建类B,在B里面定义2个整数对象
...     a = 100
...     b = 1000
...
>>> A.a is A.b   # 同一代码块里面的同值的小整数是同一个对象
True
>>> A.a is B.a   # 不同块中的同值的小整数对象是同一个对象。
True
>>> A.c is A.d   # 同代码块中同值的大整数对象是同一个对象
True
>>> A.d is B.b   # 不同代码块中的同值的大整数对象不是同一个对象
False
>>>

is” 和“==”的区别:

前提知识:Python中对象包含的三个基本要素,分别是:id(身份标识)、type(数据类型)和value(值)。

注释:id()是对象的身份,相当于我们每个人的身份证号码一样,唯一值。

"=="是用来比较对象的数值(内容)的,它是以value来判段的。

"is"是用来比较对象的身份的,它是以id来判断的。

>>> a = 100000
>>> b = 100000
>>> a == b
True   # 数值相等
>>> a is b
False  # 不同对象
>>>
 
# 可以从id值看出这两个不是同一个对象。
>>> id(a)
2524207766000
>>> id(b)
2524207765904
————————————————
版权声明:本文为CSDN博主「有梦想的小树」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_38109046/article/details/88054544

————————————————
版权声明:本文为CSDN博主「有梦想的小树」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_38109046/article/details/88054544

猜你喜欢

转载自blog.csdn.net/LLY_A_/article/details/106724213