Python中'is'与'=='的差异及整数赋值特殊现象解惑
Python中整数赋值的
is判断差异与is和==的区别 先明确is与==的核心差异
==:只关心两个对象的值是否相等,它会调用对象的__eq__()方法做值的比较,只要值一致就返回True。is:判断两个变量是否指向内存中的同一个对象,它比较的是对象的身份标识(可通过id()函数查看对象内存地址),只有当两个变量指向同一个实例时才返回True。
为什么256和300的is判断结果不同?
Python为了提升运行性能,内置了小整数缓存机制:它会预先创建并缓存-5到256之间的所有整数对象。当你在这个范围内创建整数变量时,Python不会每次生成新对象,而是直接返回缓存里的已有对象。
比如执行:
a = 256 b = 256
a和b指向的是缓存中同一个256对象,所以a is b返回True。
而对于超出-5~256范围的整数,Python默认不会缓存,每次赋值都会创建全新的对象。比如:
a = 300 b = 300
a和b是两个内存地址不同的300对象,所以a is b返回False。
补充验证示例
# 验证小整数缓存 a = 256 b = 256 print(id(a) == id(b)) # 输出True,说明是同一个对象 print(a is b) # True print(a == b) # True # 验证非缓存整数 a = 300 b = 300 print(id(a) == id(b)) # 输出False,说明是不同对象 print(a is b) # False print(a == b) # True,值相等所以返回True
注意:在脚本文件的同一行赋值大整数时,Python解释器可能会做额外优化让它们指向同一个对象,但这属于特殊情况,不能依赖这种行为。
内容的提问来源于stack exchange,提问作者graj499
相关产品推荐
相关产品推荐

