对于int类型的数据,Python中的常量池范围是[-5, 257)。
以如下两种示例进行说明:
a = 256
b = int("256")
print(id(a), id(b)) #1363708960 1363708960
a = 257
b = int("257")
print(id(a), id(b)) #2163797257264 2163777964656
a = -5
b = int("-5")
print(id(a), id(b)) # 1363700608 1363700608
a = -6
b = int("-6")
print(id(a), id(b)) # 2898080953648 2898059889264
或者
>>> a = 256
>>> b = 256
>>> a is b
True
>>>
>>> a = 257
>>> b = 257
>>> a is b
False
>>>
我们通过id来查看变量的地址,或者通过is操作符来检查是否指向同一个对象,都可以看到临界值256是一个已存在的对象,但257不是。
原因
Python启动之后,-5到256之间的整型数值就已经在内存中被分配为了对应的整型对象。如果我们创建了一个-5到256之间的整数,实际上拿到的是一个对于整型对象的引用。但如果使用了257,则会重新在内存中生成一个新的对象,因此内存地址会不同。
Bonus
还有另一种情况值得注意:
>>> a = 257;b = 257
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False
如果在终端中把对a和b的赋值放在同一行中进行执行,那么Python解释器会先创建一个新的对象,然后同时进行引用,所以得到的二者的内存地址相同。
但这种情况只存在于在终端中操作的时候。如果我们在一个py文件中使用将两条赋值语句放在同一行的操作,得到的地址就是相同的。
a = 257
b = 257
print(id(a), id(b))
# 1908009594288 1908009594288
这是因为整个文件是同时被编译的。