python中的关于is的奇怪现象

Posted 天青色wy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中的关于is的奇怪现象相关的知识,希望对你有一定的参考价值。

【Python 3.7.0】

python中is比较的是两个对象的id值是否相等,也就是比较俩对象是否为同一个实例对象,是否指向同一个内存地址。

在实际使用过程中我发现,is有时有点奇怪。

在python交互式模式中:

发现有些整数is的值是True,有些是False,为何会这样?到底哪些整数不会新建对象呢?

在py文件中写个程序测一下:

 

 

发现在-5到256之间的整数不会新建对象。

出于性能优化,对于整数对象,Python把一些频繁使用的整数对象[-5-256]缓存起来,保存到一个叫small_ints的链表中,有的称小整数对象池,在Python的整个生命周期内,任何需要引用这些整数对象的地方,都不再重新创建新的对象,而是直接引用缓存中的对象。

但是在py文件中:

 

这可真是奇怪呀,怎么这个也是True了呢?这个也不会新建对象?

后来在函数里试试:

 

如果把函数看成一个代码块,那么可以总结一下:

在同一个代码块内:

对于不可变类型的对象如数字,字符串,布尔值,元组,多个变量会共享一个对象。这些变量指向同一片内存地址。可变类型的如列表字典集合之流就会新建对象。


在不同代码块之间:
除整数[-5-256]之外的数字都会新建对象;
带特殊字符的字符串会新建对象;
元组列表集合都会新建对象。
。。。

这间接证明了我上面的寻找不变对象的整数[-5-256]的那段代码的正确性。

至此,我发现了一个规律,那就是这玩意根本就没规律,说白了就是扯淡。哎,浪费我时间去研究,好气啊~~

 

以上是关于python中的关于is的奇怪现象的主要内容,如果未能解决你的问题,请参考以下文章

关于python中的is和==的区别

一个关于ExecutorService shutdownNow时很奇怪的现象

关于Python中的yield

关于Python中的yield

关于HTML5中video标签的奇怪现象

一段神奇的代码-关于PHP字符变量奇怪现象的解释