Python变量赋值256前后表现差异及版本间不同表现原因咨询
Python整数对象身份差异的原因解析
核心原因是Python的小整数缓存机制,结合代码执行环境(交互式 vs 脚本模式)、不同版本的常量优化策略调整共同导致的差异:
小整数缓存的默认规则
Python为了性能优化,会预先缓存-5到256之间的整数对象,这部分是程序中最常用的整数范围。只要变量赋值为这个区间内的整数(比如256),多个变量都会指向同一个对象,因此用is判断结果为True,这一规则在各版本中基本一致。超出256的整数处理差异
- Python 3.8.10 交互式环境:交互式环境中每一行代码是独立的执行单元(代码块)。对于257这种超出默认缓存范围的整数,每次赋值都会创建新的整数对象,因此两个变量的
id不同,is判断结果为False。 - Python 3.6 脚本模式(pythontutor环境):在Python 3.6及更早版本中,同一代码块内的相同整数字面量会触发常量折叠优化——编译器会把相同的字面量合并为同一个对象。即使是257这类超出默认缓存的整数,只要在同一代码块中多次赋值,也会指向同一个对象,所以
is判断为True。而pythontutor通常将代码作为完整脚本执行,属于同一代码块,因此表现和交互式环境不同。
- Python 3.8.10 交互式环境:交互式环境中每一行代码是独立的执行单元(代码块)。对于257这种超出默认缓存范围的整数,每次赋值都会创建新的整数对象,因此两个变量的
补充:
is与==的区别
别混淆两者的作用:is判断的是两个变量是否指向同一个对象(即id是否相同),==判断的是两个变量的值是否相等。无论整数是否在缓存范围内,只要值相同,a == b的结果都是True。
内容的提问来源于stack exchange,提问作者PtrDrv
相关产品推荐
相关产品推荐

