欢迎访问Python每天3分钟系列。
每天早上8点半,花3分钟时间,学习或温习一个Python知识点。
今天是第2周了,换个主题样式,希望能给大家带来新鲜感,新的一周祝大家都有收获。
感谢还在跟踪的小伙伴!可以通过文章上方的话题链接查看本系列其他文章。
今天是第008篇:让人迷糊的数字内存地址。
迷幻的结果
关键词is
用来判定两个变量是不是同一个对象。
它们如果在内存中是同一个地址,就返回True,否则返回False。
如果在内存中不是同一个地址,就算是值是一样的,也会返回返回False。
在交互式Python下,运行这段代码:
>>> a = 198
>>> b = 198
>>> a is b
True
打印结果是True
,说明a和b是同一个对象。
再看这段:
>>> a = 257
>>> b = 257
>>> a is b
False
打印结果竟然是False
,说明a和b不是同一个对象。
注意:必须在交互式Python下运行才会有这样的结果,后面会解释为什么。
这就奇怪了,为什么198是同一个对象,257就不是了呢?
再看这个:
>>> a = 257;b=257 #两个赋值语句写在同一行,用分号隔开
>>> a is b
True
打印的结果竟然又成了True
。WTF????
解惑
上面的诡异现象是由于Python解释器的优化造成的。
-
Python把一定常见的数字(-5到256)放在一个统一的地方,如果程序中用到了就会直接使用这个统一的地方的数字。198属于这个范围,所以不管我们定义多少不同的变量,实际上都是用的这同一个,放在内存中是同一个地方。 -
而257不属于上面的范围,虽然a和b都是257。定义新的变量的时候,内存中会开辟一个新的地址保存257。我们用 is
是比较的内存地址,所以是False
。如果我们用==
做比较,他们比较的是值,就是相同的。 -
那第三段怎么又是True了呢?那是因为Python的解释器还有一个优化,如果两个变量在同一个代码块中(在例子中是同一行,所以肯定是同一个代码块),那么为了节省空间,值相同的变量也会共用同一个内存空间。所以就又是True了。 如果我们把这些代码放在同一个Python文件中执行,也被认定为同一个代码块,也会共用同一个变量。
a = 257 b = 257 print(a is b)
执行结果为
True
。
今天的内容有点迷幻,因为涉及到了Python解释器的优化。
声明:本网站资源来源于网络收集,如有侵权,请联系站长进行删除处理。 分享目的仅供大家学习和交流,请不要用于商业用途,否则后果自负。本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解。本站资源售价只是赞助,收取费用仅维持本站的日常运营所需。反馈邮箱:1159995880@qq.com
评论(0)