2024-05-05 11:49:25 发布
网友
据我所知,Python中的一切都是object,id()应该(我说得对吗?)为每个对象返回不同的数字。在
在我的例子中,id(1)返回4298178968,id(2)返回{},但是我得到的所有浮点类型的值相同,id(1.1)返回{},id(2.2)也返回{}等等。在
id(1)
4298178968
id(2)
id(1.1)
id(2.2)
为什么所有浮点值的id都是相同的?在
Python可以重用内存位置。在
跑步时:
创建一个float值,请求它的id(),然后Python再次删除该值,因为没有引用它。然后,当您创建另一个浮点值时,Python可以重用相同的内存位置,因此id(2.2)很可能为id()返回相同的值:
id()
请执行以下操作:
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解释器本身已经引用了它们,并且在解释器退出之前不会删除它们。在
1
>>> id(1.1) 154154684
由于1.1未分配给任何变量,因此它被垃圾回收,下次将使用相同的id作为浮点:
将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)
-5
对于字符串:
与整数一样,一些字符串也缓存在python中。因此,这类字符串的id将不同(有关详细信息,请阅读:'is' operator behaves differently when comparing strings with spaces):
id
>>> id('foo') 162861592 >>> id('foo') 162861568
非字母数字字符串(使用相同的id):
>>> id('foo!&9((&') 162840000 >>> id('foo!&9((&') 162840000
Python可以重用内存位置。在
跑步时:
创建一个float值,请求它的
^{pr2}$id()
,然后Python再次删除该值,因为没有引用它。然后,当您创建另一个浮点值时,Python可以重用相同的内存位置,因此id(2.2)
很可能为id()
返回相同的值:请执行以下操作:
现在浮点值引用了它们(这两个变量),不会被销毁,它们现在有不同的内存位置,因此
id()
值。在对于小整数(从-5到256),您看到不同的
id()
值是因为these values are interned;Python只创建一个1
整数对象,并反复使用它。因此,这些整数都有一个唯一的内存地址regardles,因为Python解释器本身已经引用了它们,并且在解释器退出之前不会删除它们。在由于1.1未分配给任何变量,因此它被垃圾回收,下次将使用相同的id作为浮点:
^{pr2}$将1.1保存在变量中:
现在使用新地址:
这同样适用于整数:
从}的整数实际上缓存在python中,因此它们总是返回不同的id。("is" operator behaves unexpectedly with integers)
-5
到{对于字符串:
与整数一样,一些字符串也缓存在python中。因此,这类字符串的
id
将不同(有关详细信息,请阅读:'is' operator behaves differently when comparing strings with spaces):非字母数字字符串(使用相同的
id
):相关问题 更多 >
编程相关推荐