You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python调用float()是否每次创建不同对象实例?代码运行结果疑问

核心原理说明

首先明确is运算符的本质:is用来判断两个引用是否指向内存中的同一个对象,等价于判断id(a) == id(b)。你观察到的差异完全是CPython解释器的内部实现机制导致的,和float()、int()的调用逻辑、内置缓存规则直接相关。

三个输出结果的逐行解释

1. print(float(5.3) is float(5.3))返回True的原因

当float()的入参本身就是float类型时,CPython的float()构造函数会直接返回原对象,不会创建新实例。
而你代码里两次传入的5.3是同一个代码块内的相同字面量,CPython在编译阶段会做常量折叠优化,同一个作用域内相同的字面量只会存储一份,所以两次float(5.3)返回的都是同一个字面量对象,因此is判断为True。

2. print(float(5) is float(5))返回False的原因

这里float()的入参是整数类型的5,需要做类型转换生成浮点数5.0。
CPython没有为浮点数设计全局驻留缓存机制,每次执行整数转浮点数的操作时,都会新创建一个float对象,两次调用就生成了两个值相同但内存地址不同的5.0实例,因此is判断为False。

3. print(int(5) is int(5))返回True的原因

CPython实现了小整数驻留机制:解释器启动时就会预先创建并缓存[-5, 256]区间内的所有整数对象,所有需要用到这个区间内整数的场景,都会直接返回缓存的同一对象,不会重新创建。
5属于这个缓存区间,所以不管多少次调用int(5),返回的都是同一个缓存对象,因此is判断为True。

补充注意点

  • 以上都是CPython的实现细节,不属于Python语言的官方规范,其他Python解释器(比如PyPy)、或者不同版本的CPython运行同一段代码可能得到不同的结果。
  • 永远不要依赖对象的内存地址判断值相等,值对比请统一使用==运算符。

内容的提问来源于stack exchange,提问作者Hrishi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:54:04