id(float)的值相同

ehs*_*net 13 python

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

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

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

Mar*_*ers 20

Python可以重用内存位置.

当你运行:

id(1.1)
Run Code Online (Sandbox Code Playgroud)

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

>>> id(1.1)
140550721129024
>>> id(2.2)
140550721129024
Run Code Online (Sandbox Code Playgroud)

改为:

float_one, float_two = 1.1, 2.2
print id(float_one), id(float_two)
Run Code Online (Sandbox Code Playgroud)

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

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


Ash*_*ary 5

>>> id(1.1)
154154684
Run Code Online (Sandbox Code Playgroud)

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

>>> id(2.2) 
154154684
Run Code Online (Sandbox Code Playgroud)

将 1.1 保存在变量中:

>>> f = 1.1
>>> id(f)
154154684  #this id is locked for now
Run Code Online (Sandbox Code Playgroud)

现在使用新地址:

>>> id(1.1)
154154700
>>> id(2.2)
154154700
Run Code Online (Sandbox Code Playgroud)

这也适用于整数:

>>> id(260)
154302180
>>> id(280)
154302180
Run Code Online (Sandbox Code Playgroud)

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

对于字符串

与整数一样,一些字符串也缓存在 python 中。因此,id这样的字符串将会有所不同(有关详细信息,请阅读:在将字符串与空格进行比较时,“is”运算符的行为有所不同):

>>> id('foo')
162861592
>>> id('foo')
162861568
Run Code Online (Sandbox Code Playgroud)

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

>>> id('foo!&9((&')
162840000
>>> id('foo!&9((&')
162840000
Run Code Online (Sandbox Code Playgroud)