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

时间:2015-08-13 02:22:13

标签: python

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

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

1 个答案:

答案 0 :(得分:7)

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