鱼C论坛

 找回密码
 立即注册
查看: 1847|回复: 2

[已解决]python 的float类型的free_list缓存机制失效了

[复制链接]
发表于 2023-8-31 19:25:05 | 显示全部楼层 |阅读模式
20鱼币
v1 = 3.14
print( id(v1) )#打印结果1812683704720
del v1
v2 = 9.999。
print( id(v2) )#打印结构1812681091952,与上一个不一样
最佳答案
2023-8-31 19:25:06
本帖最后由 阿奇_o 于 2023-8-31 23:08 编辑

应该是你理解错了,自己试试如下代码,再想想它到底或大概是个怎么缓存法:
  1. >>> id(3.14)
  2. 2060525561136
  3. >>> id(3.14)
  4. 2060525561168
  5. >>> id(3.14)
  6. 2060526465072    # 对比上一个,为啥不同呢? (或许对于字面值,它并没有采取缓存机制,而是根据需要生成)
  7. >>> id(9.99)
  8. 2060525561136

  9. # 那再看这样呢?
  10. >>> v1 = 3.14
  11. >>> id(v1)
  12. 2060526465072    # 诶?这里怎么用上了呢?这就是上面那个呀——这是不是缓存 ? 是的

  13. >>> v2 = 3.14
  14. >>> id(v2)   
  15. 2060525563856    # 但对于不同的绑定,它并没有绑定到同一个对象上,而是会新生成一个 (因为浮点数属于基本数据类型,非 引入类型)
  16. >>> id(v2)
  17. 2060525563856
  18. >>> id(v1)
  19. 2060526465072
  20. >>>
  21. ## ps: 对于字面值,它其实也用了缓存机制,只是貌似有点随机,可能是从free_list里按某种方式选取一个出来。。哈哈,你自己可以多试几个
复制代码


QQ截图20230831192449.png

最佳答案

查看完整内容

应该是你理解错了,自己试试如下代码,再想想它到底或大概是个怎么缓存法:

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-8-31 19:25:06 | 显示全部楼层    本楼为最佳答案   
本帖最后由 阿奇_o 于 2023-8-31 23:08 编辑

应该是你理解错了,自己试试如下代码,再想想它到底或大概是个怎么缓存法:
  1. >>> id(3.14)
  2. 2060525561136
  3. >>> id(3.14)
  4. 2060525561168
  5. >>> id(3.14)
  6. 2060526465072    # 对比上一个,为啥不同呢? (或许对于字面值,它并没有采取缓存机制,而是根据需要生成)
  7. >>> id(9.99)
  8. 2060525561136

  9. # 那再看这样呢?
  10. >>> v1 = 3.14
  11. >>> id(v1)
  12. 2060526465072    # 诶?这里怎么用上了呢?这就是上面那个呀——这是不是缓存 ? 是的

  13. >>> v2 = 3.14
  14. >>> id(v2)   
  15. 2060525563856    # 但对于不同的绑定,它并没有绑定到同一个对象上,而是会新生成一个 (因为浮点数属于基本数据类型,非 引入类型)
  16. >>> id(v2)
  17. 2060525563856
  18. >>> id(v1)
  19. 2060526465072
  20. >>>
  21. ## ps: 对于字面值,它其实也用了缓存机制,只是貌似有点随机,可能是从free_list里按某种方式选取一个出来。。哈哈,你自己可以多试几个
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-8-31 19:25:32 | 显示全部楼层
这是因为Python中的浮点数类型(float)采用了缓存机制。当你创建一个浮点数对象时,Python会尝试从一个叫做"free_list"的缓存中获取一个可用的浮点数对象,而不是每次都创建一个新的对象。

在你的代码中,当你创建v1并打印它的id时,你实际上是在访问缓存中的一个浮点数对象,因此它的id是1812683704720。当你删除v1后,该对象被释放并返回到缓存中。

然后,当你创建v2时,Python会再次尝试从缓存中获取一个可用的浮点数对象,但是由于此时缓存中没有可用的对象,所以Python会创建一个新的对象。因此,v2的id是1812681091952,与v1的id不同。

这个缓存机制的目的是为了提高性能,因为创建和销毁对象需要一定的时间。但是需要注意的是,这个缓存机制只适用于一定范围内的浮点数值。对于超出范围的浮点数,仍然会创建新的对象。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 22:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表