Python变量赋值与引用疑问:整数与浮点数'is'判断结果为何不同?
为什么Python中整数1的两个变量用
is判断为True,而浮点数1.的两个变量却为False? 这事儿本质是Python的小整数缓存机制在起作用,而浮点数并没有这套优化策略,所以才会出现两种截然不同的结果。
先说说整数的情况:
- Python为了提升性能,会提前把**常用的小整数(默认范围是-5到256)**创建好,放在一个专门的缓存池里。
- 当你执行
a = 1和b = 1时,这两个变量其实都指向了缓存池里同一个整数对象,而不是各自新建一个。 - 因为
is运算符判断的是两个变量是否指向同一个内存地址的对象,所以a is b会返回True。
你可以用id()函数验证一下,会发现两个变量的内存地址完全相同:
a = 1 b = 1 print(id(a)) # 输出某个内存地址 print(id(b)) # 和上面的地址一模一样 print(a is b) # True
再看浮点数的情况:
- 浮点数没有类似的缓存机制,每次你赋值
1.的时候,Python都会在内存中新建一个float对象。 - 这时候
a和b指向的是两个不同的内存地址,所以a is b自然返回False。
同样用id()验证:
a = 1. b = 1. print(id(a)) # 一个地址 print(id(b)) # 另一个不同的地址 print(a is b) # False
额外补充一点:如果整数超出了小整数的缓存范围,结果也会和浮点数一样。比如:
a = 257 b = 257 print(a is b) # False(标准CPython环境下)
你之前预期两个判断都是False,是默认认为每次赋值都会新建对象,这其实是大部分情况的逻辑,但Python对高频使用的小整数做了特殊优化,才产生了这个例外~
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

