python 的float类型的free_list缓存机制失效了
v1 = 3.14print( id(v1) )#打印结果1812683704720
del v1
v2 = 9.999。
print( id(v2) )#打印结构1812681091952,与上一个不一样 本帖最后由 阿奇_o 于 2023-8-31 23:08 编辑
应该是你理解错了,自己试试如下代码,再想想它到底或大概是个怎么缓存法:>>> id(3.14)
2060525561136
>>> id(3.14)
2060525561168
>>> id(3.14)
2060526465072 # 对比上一个,为啥不同呢? (或许对于字面值,它并没有采取缓存机制,而是根据需要生成)
>>> id(9.99)
2060525561136
# 那再看这样呢?
>>> v1 = 3.14
>>> id(v1)
2060526465072 # 诶?这里怎么用上了呢?这就是上面那个呀——这是不是缓存 ? 是的
>>> v2 = 3.14
>>> id(v2)
2060525563856 # 但对于不同的绑定,它并没有绑定到同一个对象上,而是会新生成一个 (因为浮点数属于基本数据类型,非 引入类型)
>>> id(v2)
2060525563856
>>> id(v1)
2060526465072
>>>
## ps: 对于字面值,它其实也用了缓存机制,只是貌似有点随机,可能是从free_list里按某种方式选取一个出来。。哈哈,你自己可以多试几个
这是因为Python中的浮点数类型(float)采用了缓存机制。当你创建一个浮点数对象时,Python会尝试从一个叫做"free_list"的缓存中获取一个可用的浮点数对象,而不是每次都创建一个新的对象。
在你的代码中,当你创建v1并打印它的id时,你实际上是在访问缓存中的一个浮点数对象,因此它的id是1812683704720。当你删除v1后,该对象被释放并返回到缓存中。
然后,当你创建v2时,Python会再次尝试从缓存中获取一个可用的浮点数对象,但是由于此时缓存中没有可用的对象,所以Python会创建一个新的对象。因此,v2的id是1812681091952,与v1的id不同。
这个缓存机制的目的是为了提高性能,因为创建和销毁对象需要一定的时间。但是需要注意的是,这个缓存机制只适用于一定范围内的浮点数值。对于超出范围的浮点数,仍然会创建新的对象。
页:
[1]