为什么id函数的行为与整数和浮点数不同?

kvi*_*vek 4 python python-2.7

我尝试了以下代码,它给了我不同的输出.

>>> foo1 = 4
>>> foo2 = 2+2
>>> id(foo1)
37740064L
>>> id(foo2)
37740064L

>>> foo1 = 4.3
>>> foo2 = 1.3+3.0
>>> id(foo1)
37801304L
>>> id(foo2)
37801232L
>>>
Run Code Online (Sandbox Code Playgroud)

我使用的是python 2.7.2.为什么id函数在浮点数时返回不同的值,但在整数的情况下返回相同的值?

rod*_*igo 5

这是因为id数字常量的结果是实现定义的.

在你的情况下,Python 2.7.2,IIRC,问题是编译器构建一些有用的整数常量作为单例(从-1到100左右).基本原理是这些数字被频繁使用,每次需要时动态分配它们是没有意义的,它们只是被重用.

但是这个常数单例优化对于float值不是很有用,除了0.0以外,它们太多了!因此,每次float需要一个新值时,它都会被分配,并获得不同的id.

要获得更深入的洞察力,请阅读来源!这个文件来自Python3,但想法是一样的:寻找small_ints数组.