Python同值变量为何指向同一内存地址?含float实例疑问
问题解答
为什么浮点数案例中a is b返回True?
Python对整数的[-5, 256]驻留是明确的语言优化规则,但浮点数的对象复用没有统一的强制规范,这完全依赖于具体解释器(比如CPython)的实现和运行时优化:
- 在你的案例中,
999.99 + 0.01的计算结果恰好是1000.0,而CPython的解释器在某些场景下(比如常量表达式求值、结果为可精确表示的浮点数)会复用已存在的浮点数对象,导致a和b指向同一块内存。 - 这种行为是不稳定且不可依赖的,换个计算方式、不同版本的Python或者其他解释器(比如PyPy),结果可能就会变成
False。记住:is判断的是对象身份,而==判断的是值相等,浮点数的对象复用从来不是语言规范的一部分。
满足a==b为True但a is b为False的浮点数案例
下面是两个可靠的案例,通过不同的对象创建路径生成值相等但身份不同的浮点数:
案例1:通过字符串转换创建新对象
# 直接赋值创建浮点数对象 a = 1000.0 # 通过字符串转换生成新的浮点数对象 b = float(str(a)) print(a == b) # 输出: True print(a is b) # 输出: False
案例2:通过函数返回避免常量优化
def generate_float(): return 1000.0 a = 1000.0 b = generate_float() print(a == b) # 输出: True print(a is b) # 输出: False
补充说明
浮点数的精度问题可能干扰测试(比如0.1 + 0.2 != 0.3),所以案例中选择了可精确表示的整数型浮点数,确保a==b的结果稳定为True。
内容的提问来源于stack exchange,提问作者Senthooran B
相关产品推荐
相关产品推荐

