Python中is not判断大于256的整数为何出现异常输出?
为什么这段Python代码用
is not会有意外输出? 先看问题场景:
运行下面这段代码时,预期应该没有任何输出,但实际打印了257到259这三组数值:
for ind, elem in enumerate(range(260)): if ind is not elem: print(ind , elem)
输出结果:
257 257 258 258 259 259
而把判断条件换成!=后,代码就符合预期,没有输出:
for ind, elem in enumerate(range(260)): if ind != elem: print(ind , elem)
问题根源:is not和!=的本质区别
!=是值比较:只判断两个对象的数值是否相等,不管它们是不是同一个对象is not是身份比较:判断两个对象在内存中是不是同一个实体(即内存地址是否相同)
整数缓存机制的影响
Python有个小整数优化策略:默认会提前创建并缓存-5到256之间的整数对象。也就是说,这个范围内的整数,不管你通过什么方式生成,拿到的都是同一个内存地址的对象。
但对于257及以上的整数,Python不会缓存,每次生成都会创建新的对象。回到代码里:
- 当循环到0-256时,
ind(enumerate生成的索引)和elem(range生成的数值)是同一个缓存对象,所以ind is elem为True,is not条件不触发,不会打印 - 当循环到257-259时,
ind和elem是两个独立创建的整数对象,内存地址不同,所以ind is not elem为True,触发打印;但它们的数值是相等的,所以!=条件不成立,不会打印
内容的提问来源于stack exchange,提问作者Kumar Atul
相关产品推荐
相关产品推荐

