为何Python Lambda函数中浮点数身份比较会出现不一致结果?
为什么Python中
lambda n: n is 0.0判断0.0会返回False? 先把你遇到的代码现象再明确下:
>>> zero = lambda n: n is 0 >>> zero(0) # 输出 True >>> zero = lambda n: n is 0.0 >>> zero(0.0) # 输出 False
出现这种差异的核心原因,要从两个关键细节说起:
is运算符的本质:它不是用来比较值是否相等的,而是判断两个变量是否指向内存中的同一个对象(可以用id()函数查看对象的内存身份标识)。如果只是想比较值是否相等,应该用==。- Python的对象缓存机制:
- 对于小范围整数(通常是-5到256),Python会提前把这些整数对象缓存起来,每次使用这些整数时,都是直接复用已经存在的对象。所以不管你写多少次
0,指向的都是内存里同一个对象,n is 0自然返回True。 - 但浮点数没有这个缓存待遇,哪怕是
0.0这种简单的浮点数,每次你写出0.0,Python都会在内存里创建一个全新的浮点数对象。这么一来,lambda里的0.0和你传入的参数0.0,其实是两个不同的对象,内存身份不一样,is判断自然返回False。
- 对于小范围整数(通常是-5到256),Python会提前把这些整数对象缓存起来,每次使用这些整数时,都是直接复用已经存在的对象。所以不管你写多少次
你可以用id()函数直观验证这个差异:
>>> id(0) == id(0) True >>> id(0.0) == id(0.0) False
内容的提问来源于stack exchange,提问作者user7501761
相关产品推荐
相关产品推荐

