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]的那段代码的正确性。
至此,我发现了一个规律,那就是这玩意根本就没规律,说白了就是扯淡。哎,浪费我时间去研究,好气啊~~