python交互式中的小整数池以及python的is用法

大家好,话不多说,先抛出问题:
1.在Sublim 中写一段源代码,生成一个源文件,再放到解释器中去执行,代码如下:

money = 2000000
salary = 2000000
print(money is salary)   #在交互式中执行结果就是False

放到解释器中执行:

D:\python_work>python oper_compare.py
True

2.直接在交互式模式下进行比较

D:\python_work>python
Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> money = 2000000
>>> print(id(money),money)
1325603786544 2000000
>>> salary = 2000000
>>> print(id(salary),salary)
1325604039376 2000000
>>> age = 8
>>> age1 = 8
>>> print(salary is money)
False
>>> print(age is age1)
True

这个时候呢我们就会发现问题了:1.为什么用源文件的时候money is salary的结果是True,但是在交互式当中的结果却是False呢?2.为什么money is salary的结果是False,但是age is age1的结果却是True呢?

在回答上面两个问题之前,我先说一下 is 是什么意思怎么用。is是用于对象(内存的地址)的比较。也就是说最后的结果是两个对象的内存地址码是否相同,如果相同那结果就是True,如果不相同结果就是False。

那么就来看看是什么原因导致的上面的两个问题呢?
1.因为当把程序写到源文件中,再放到解释器中执行是一个完整的过程,这个过程是从源文件的第一行代码开始,直到最后一行代码,所以在一个过程中python为2000000这个“常量”开辟的是一个内存空间,money和salary都是获取的这一个值的同一个地址码(这就实现了复用),所以money is salary 的结果是True。但是在交互式中,一行就是一个过程,所以money和salary开辟了两个内存空间来存放2000000,所以这俩个地址码是不相等的喽。因此money is salary 的结果就是False。
2.在交互式中,会有一个小整数池,这个池的范围是从[-5,256],当程序语句用到这些整数的时候,就会从这个小整数池中取出需要的整数来。比如:、

>>> age2 = -5
>>> age3 = -50
>>> print(age is age1)
True
>>> age4 = 256
>>> age5 = 256
>>> print(age4 is age5)
True

这也能实现一部分的复用,小整数池的目的就是节省内存,提高执行效率。在pycharm中运行python程序时,pycharm出于对性能的考虑,会扩大小整数池的范围,其他的字符串等不可变类型也包含在内,一便采用相同的方式处理了。

猜你喜欢

转载自blog.csdn.net/qq_45381011/article/details/107497112