鱼C论坛

 找回密码
 立即注册
查看: 1410|回复: 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 编辑

应该是你理解错了,自己试试如下代码,再想想它到底或大概是个怎么缓存法:
>>> 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里按某种方式选取一个出来。。哈哈,你自己可以多试几个

QQ截图20230831192449.png

最佳答案

查看完整内容

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

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-8-31 19:25:06 | 显示全部楼层    本楼为最佳答案   
本帖最后由 阿奇_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里按某种方式选取一个出来。。哈哈,你自己可以多试几个

想知道小甲鱼最近在做啥?请访问 -> 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不同。

这个缓存机制的目的是为了提高性能,因为创建和销毁对象需要一定的时间。但是需要注意的是,这个缓存机制只适用于一定范围内的浮点数值。对于超出范围的浮点数,仍然会创建新的对象。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 02:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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