正在回答 回答被采纳积分+1
小整数池是 -5~256,这区间的都是同一个地址,在终端和 Pycharm 上都是相同的。
例子:
# 假设这两个字符串都是同样的内容 a = '一个非常常的字符串...' b = '另一个非常常的字符串...'
如果这个字符串非常长,整个程序中可以有无数个地方发生“多个变量的字符串内容都相同”,Python 不会傻到给每个变量都开辟一个新的存储空间,那岂不是太浪费内存了。
所以在 Pycharm 中是正常的,a is b 就是 True。
之所以在终端中 a is b 是 False,是因为交互式模式需要给每一行命令都通过解释器解释一下,每一行命令赋值的变量都可以单独使用,解释器并没有对此进行优化。
另外交互模式本来就是临时操作或操作简单内容来用的,没必要过分优化。
简单来说:
>>> a = 257; b = 257 >>> id(a), id(b) (4472944656, 4472944656) >>> a is b True --------分割线-------- >>> a = 257 >>> b = 257 >>> id(a), id(b) (4472944912, 4472944976) >>> a is b False
如果在交互模式中,你把他们写在同一行,解释器也是能做到优化的。
如果不写在同一行, >>> a = 257 和 >>> b = 257 都被解释器单独解释了,因为范围不在小整数池。
单独解释的意思:
>>> a = 257 ,解释器一看,不在小整数池,把 a 按顺序分配到了 4472944912。
>>> b = 257 ,解释器一看,不在小整数池,把 b 按顺序分配到了 4472944976。
>>> a = 257; b = 257,解释器一看,不在小整数池,但是内容相同,都分配 4472944656 同一个地址吧。
注意仅限不可变类型,学过 C 语言内存方面的都应该知道,像数组这种可变类型,即便多个变量内容相同也不能分配同一块内存地址,因为一旦有一个发生改变,就得开辟新空间,写入新数据。如果原数组内容太大,对性能影响很大。
- 参与学习 人
- 提交作业 2727 份
- 解答问题 8160 个
想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星