无名商城论坛

搜索
查看: 300|回复: 0

[其他技术] 【HC】Python 的常量池

[复制链接]

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表