Python的常量池

对于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

这是因为整个文件是同时被编译的。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值