14

据我所知,Python 中的一切都是对象,id()应该(对吗?)为每个对象返回不同的数字。

在我的情况下,id(1)returns 4298178968id(2)returns4298178944但我得到所有浮点类型的相同值,id(1.1)returns 4298189032id(2.2)也returns4298189032等等。

为什么我对所有浮点值都得到相同的id ?

4

2 回答 2

21

Python 可以重用内存位置。

当你运行时:

id(1.1)

你创建一个 float 值,请求它的id(),然后 Python再次删除该值,因为没有任何东西引用它。然后,当您创建另一个浮点值时,Python 可以重用相同的内存位置,因此id(2.2)很可能返回相同的值id()

>>> id(1.1)
140550721129024
>>> id(2.2)
140550721129024

改为这样做:

float_one, float_two = 1.1, 2.2
print id(float_one), id(float_two)

现在浮点值有对它们的引用(两个变量)并且不会被破坏,并且它们现在具有不同的内存位置和id()值。

您看到id()小整数(从 -5 到 256)的不同值的原因是因为这些值是 interned;Python 只创建一个 1整数对象并一遍又一遍地重用它。因此,这些整数都有一个唯一的内存地址,因为 Python 解释器本身已经引用了它们,并且在解释器退出之前不会删除它们。

于 2013-06-16T09:57:13.723 回答
5
>>> id(1.1)
154154684

由于 1.1 没有分配给任何变量,所以它被垃圾收集,下次相同的 id 将用于浮点数:

>>> id(2.2) 
154154684

将 1.1 保存在变量中:

>>> f = 1.1
>>> id(f)
154154684  #this id is locked for now

现在使用新地址:

>>> id(1.1)
154154700
>>> id(2.2)
154154700

这也适用于整数

>>> id(260)
154302180
>>> id(280)
154302180

-5从to 到的整数256实际上缓存在 python 中,因此它们总是会返回不同的 ID。(“is”运算符对整数的行为出乎意料

对于字符串

像整数一样,一些字符串也缓存在 python 中。因此,id这样的字符串将会有所不同(详情请阅读:'is' 运算符在将字符串与空格进行比较时表现不同):

>>> id('foo')
162861592
>>> id('foo')
162861568

非字母数字字符串(使用相同id):

>>> id('foo!&9((&')
162840000
>>> id('foo!&9((&')
162840000
于 2013-06-16T10:00:33.007 回答