Skip to main content
 首页 » 编程设计

python之为什么 a=1, b=1, id(a) == id(b) 但在 python 中 a=1.0, b=1.0, id(a) != id(b)

2025年05月04日13落叶无声

a = 1 
b = 1 
id(a) == id(b) 
a = 1.0 
b = 1.0 
id(a) != id(b) 

为什么在 python 中 a 和 b 是十进制 id(a) != id(b)?
当数字是十进制时,python 将创建两个对象?

请您参考如下方法:

id(1) == id(1) 的唯一原因是缓存低整数以提高性能。尝试 id(1000) == id(1000)

实际上,有时这行得通。一个更好的测试在不同的语句中分配东西:

>>> x = 1 
>>> y = 1 
>>> id(x) == id(y) 
True 
>>> x = 1000 
>>> y = 1000 
>>> id(x) == id(y) 
False 
>>>  
>>> id(1000) == id(1000) 
True 

在更多条件下,字符串也会发生同样的事情:

>>> x = 'abcdefg' 
>>> y = 'abcdefg' 
>>> x is y 
True 

最重要的是,使用 is(或比较 id() 值,本质上是同一件事,但速度较慢)来确定两个对象是否相同是在某些情况下只是一个好的策略,因为 Python 会缓存对象以提高性能。

一个硬性规定是两个不同的可变对象将有不同的id值,但正如下面的评论者所指出的,无法保证是否会创建具有相同值的多个不可变对象。

当您使用文字值时,解释器更容易缓存内容。如果你让它计算东西,那么你可以看到哪些东西它真的很难缓存,哪些东西它机会主义地缓存,因为它注意到它们很接近:

>>> x = 1000 
>>> y = 2000 // 2 
>>> x is y 
False 
>>> x == y 
True 
>>> x = 1 
>>> y = 2 // 2 
>>> x is y 
True 
 
>>>  
>>> x = 'abcdefg' 
>>> y = 'abcdefg' 
>>> x is y 
True 
>>> y = 'abc' + 'defg' 
>>> x is y 
True 
>>> x = 'abcdefghijklmnopqrstuvwxyz' 
>>> y = 'abcdefghijklmnopqrstuvwxyz' 
>>> x is y 
True 
>>> y = 'abcdefghijklm' + 'nopqrstuvwxyz' 
>>> x is y 
False 
>>> x == y 
True