本节介绍有关整数池的问题。在 Python 中,整数可以表示的范围很大,但是常用的整数可能都集中在 -1000 到 1000 之间,如考试分数,一般在 0 到 100 之间,年龄也在 0 到 100 之间。
基于整数对象分布不均匀的特性,我们可以做一些优化来提升运行效率。
在 Python 解释器的内部实现中,对于 -5 到 256 内的整数建立了一个小整数池。如果要使用的整数对象在该范围内,其不会自动新建一个整数对象,而是看小整数池中是否有值相同的整数对象:
我们可以使用函数 id() 来查看对象的地址,在 CPython 中,id() 返回的就是某个对象在内存中的地址信息。我们可以比较这个 id 值来查看是否存在这种共享关系。另外也可以用 is 来检查两个对象是否相同。
>>> a = 12 # 创建对象a,值为12 >>> id(a) # 查看a的id值 8791344854192 >>> b = 11 # 新建对象b,值为11 >>> id(b) # 查看b的id值 8791344854160 # b的id和a的id是不同的,它们是不同的整数对象 >>> a is b # 使用is来判断a和b是不是同一个整数对象 False # 它们的确不是同一个整数对象 >>> b = b + 1 # 重新给b赋值 >>> b # 查看b的值 12 # b的值和a的值相同,都为12 >>> id(b) # 查看b现在的id值 8791344854192 # b的id发生了变化,现在和a相同了 >>> a is b # 用is来检查a和b是否是同一个对象 True # 它们的确是同一个对象