为何Shell环境中初始id相同的变量运算后is对比为False?
Python中
is运算符与整数对象的疑问解答 场景一:x + 100 is y + 100返回False的原因
执行代码如下:
x = 250 y = 250 x + 100 is y + 100 # 结果为False
原因说明:
- Python对**-5到256之间的小整数做了全局缓存**,直接赋值
x=250和y=250时,两个变量会指向内存中的同一个整数对象,所以id(x)与id(y)相同。 x + 100和y + 100是两次独立的运算,结果350不在小整数缓存范围内。Python会为这两次运算分别创建全新的整数对象,二者内存地址完全不同。is运算符的作用是判断变量是否指向同一个内存对象,而非值是否相等,因此结果为False。如果用==比较值,x + 100 == y + 100会返回True。
场景二:x += 10和y += 10后x is y返回False的原因
对应代码:
x = 250 y = 250 x is y # 结果为True x += 10 y += 10 x is y # 结果为False
原因解释:
- 初始阶段
x和y复用缓存的250对象,所以x is y返回True。 - 整数是Python的不可变类型,
x += 10并非修改原有250对象的值,而是创建新的整数对象260,再让x指向这个新对象;同理y += 10也会生成另一个独立的260对象。 - 260不在小整数缓存池范围内,两个260是内存中完全不同的对象,因此
x is y返回False。
关键总结
- 小整数缓存仅覆盖
-5到256的整数,超出此范围的整数,即使值相同,也会被创建为不同对象(同一代码块即时复用的特殊情况除外)。 - 不可变类型的"修改"操作本质是创建新对象,而非修改原有对象内容。
- 明确
is和==的区别:is比较对象身份(内存地址),==比较对象的值。
内容的提问来源于stack exchange,提问作者PPP
相关产品推荐
相关产品推荐

