据我所知,Python 中的一切都是对象,id()应该(对吗?)为每个对象返回不同的数字。
在我的情况下,id(1)
returns 4298178968
,id(2)
returns4298178944
但我得到所有浮点类型的相同值,id(1.1)
returns 4298189032
,id(2.2)
也returns4298189032
等等。
为什么我对所有浮点值都得到相同的id ?
据我所知,Python 中的一切都是对象,id()应该(对吗?)为每个对象返回不同的数字。
在我的情况下,id(1)
returns 4298178968
,id(2)
returns4298178944
但我得到所有浮点类型的相同值,id(1.1)
returns 4298189032
,id(2.2)
也returns4298189032
等等。
为什么我对所有浮点值都得到相同的id ?
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 解释器本身已经引用了它们,并且在解释器退出之前不会删除它们。
>>> 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