相同的id值(浮点数)

2024-05-05 11:49:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

在我的例子中,id(1)返回4298178968id(2)返回{},但是我得到的所有浮点类型的值相同,id(1.1)返回{},id(2.2)也返回{}等等。在

为什么所有浮点值的id都是相同的?在


Tags: 对象id类型object数字例子浮点
2条回答

Python可以重用内存位置。在

跑步时:

id(1.1)

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

^{pr2}$

请执行以下操作:

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

现在浮点值引用了它们(这两个变量),不会被销毁,它们现在有不同的内存位置,因此id()值。在

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

>>> id(1.1)
154154684

由于1.1未分配给任何变量,因此它被垃圾回收,下次将使用相同的id作为浮点:

^{pr2}$

将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到{}的整数实际上缓存在python中,因此它们总是返回不同的id。("is" operator behaves unexpectedly with integers

对于字符串

与整数一样,一些字符串也缓存在python中。因此,这类字符串的id将不同(有关详细信息,请阅读:'is' operator behaves differently when comparing strings with spaces):

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

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

>>> id('foo!&9((&')
162840000
>>> id('foo!&9((&')
162840000

相关问题 更多 >