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]的那段代码的正确性。

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

 

posted @ 2020-03-16 03:50  天青色wy  阅读(234)  评论(0编辑  收藏  举报