识别对象,为什么id(...)返回的值会发生变化?

ano*_*non 12 python

ID(对象)

这是一个整数(或长整数),保证在该生命周期内该对象是唯一且恒定的.

你能解释一下这个输出吗?为什么会j改变?

>>> i=10  
>>> id(i)  
6337824  
>>> j=10  
>>> id(j)  
6337824  
>>> j=j+1  
>>> id(j)  
6337800  
>>> id(i)  
6337824  
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 31

因为整数是不可变的,所以每个整数值都是具有唯一id的不同对象.整数10具有不同的id 11.执行j=j+1操作不会更改现有整数对象的值,而是更改j为指向对象11.

看看当我们独立创建一个新变量k并为其赋值时会发生什么11:

>>> j=10
>>> id(j)
8402204
>>> j=j+1
>>> id(j)
8402192
>>> k=11
>>> id(k)
8402192
Run Code Online (Sandbox Code Playgroud)

请注意,并非总是每个整数都有一个且只有一个对应的对象.这只适用于Python决定缓存的小整数.大整数不会发生这种情况:

>>> x = 123456789
>>> id(x)
8404568
>>> y = 123456789
>>> id(y)
8404604
Run Code Online (Sandbox Code Playgroud)

请参阅https://docs.python.org/3/c-api/long.html#c.PyLong_FromLong:

当前实现为-5到256之间的所有整数保留一个整数对象数组,当您在该范围内创建一个int时,实际上只返回对现有对象的引用.


Nin*_*Sun 12

这就是原因2**8 is 2**8 == True,而且2**9 is 2**9 == False.

预分配-5到256之间的值.