关于赋值变量的地址,cmd和pycharm中不一样

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
_D_D_ 2020-02-26 22:28:13

小整数池是 -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 语言内存方面的都应该知道,像数组这种可变类型,即便多个变量内容相同也不能分配同一块内存地址,因为一旦有一个发生改变,就得开辟新空间,写入新数据。如果原数组内容太大,对性能影响很大。

提问者 慕瓜0155640 2019-11-21 10:56:18

我发现cmd中超过257,变量不同值相同地址是不一样的。

pycharm中超过257变量变量不同值相同地址仍然一样。

是不是pycharm中所有值相同变量不同的,地址都一样?

  • 同学,你好。python会对小整数[-5,256]区间内的整数创建小整数对象池,这些对象一旦创建,就不会回收,所有新创建的在这个范围的整数都是直接引用的。因此在[-5,256]区间内的整数不同变量只要值相同,引用地址也相同。需要注意的是,仅仅是在命令行中执行,而在Pycharm中,因为解释器做了一部分优化,因此会是同学看到的情况。祝学习愉快~~~~
    2019-11-21 15:12:00
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
1.Python零基础入门
  • 参与学习           人
  • 提交作业       2727    份
  • 解答问题       8160    个

想要进入Python Web、爬虫、人工智能等高薪领域,你需要掌握本阶段的Python基础知识,课程安排带你高效学习轻松入门,学完你也能听得懂Python工程师的行业梗。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师