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
-
超出小整数范围的即为大整数