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

Peg*_*sus 1 python

a = 1
b = 1
id(a) == id(b)
a = 1.0
b = 1.0
id(a) != id(b)
Run Code Online (Sandbox Code Playgroud)

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

Pat*_*pin 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
Run Code Online (Sandbox Code Playgroud)

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

>>> x = 'abcdefg'
>>> y = 'abcdefg'
>>> x is y
True
Run Code Online (Sandbox Code Playgroud)

底线是使用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
Run Code Online (Sandbox Code Playgroud)

  • 举个例子,`id(1000)== id(1000)`在IronPython 2.9.0.0中为我返回False - 这很好,因为没有人承诺过.请注意,在许多实现中(但显然不是铁的!)可以重用在同一语句中由文字生成的对象. (2认同)