如果python变量的id小于-6,为什么会发生变化

如果python变量的id小于-6,为什么会发生变化,python,jupyter-notebook,Python,Jupyter Notebook,我刚刚在检查变量赋值的id时遇到了一个奇怪的行为。我运行了以下代码 a = -5 print(id(a)) 我的身份证如下 140710231913104 如果a>=-5多次执行Jupyter单元格时,我会得到相同的id,而如果分配并运行a

我刚刚在检查变量赋值的
id
时遇到了一个奇怪的行为。我运行了以下代码

a = -5
print(id(a))
我的身份证如下

140710231913104
如果
a>=-5
多次执行Jupyter单元格时,我会得到相同的
id
,而如果分配并运行
a<-5
,每次执行Jupyter单元格后,我都会得到不同的
id
。在下图中找到摘要

这种行为的原因可能是什么

来自
帮助(id)

id(obj,/) 返回对象的标识。
这保证在同时存在的对象中是唯一的。 (CPython使用对象的内存地址。)

对于较小的数字(不确定大小),python在内存中只保留每个数字的一个“版本”。这就是为什么每次分配
-5
,都会得到相同的内存位置。分配
-6
时,地址会更改。如果你尝试一个更大的数字,你每次都会得到不同的结果。例如:

>>> a = 9999999999999999999999; id(a)
140517821614080
>>> a = 9999999999999999999999; id(a)
140517821497216

请看下面的示例:

>>> a=256
>>> b=256
>>> print(id(a),id(b))
(31765012, 31765012)
>>> 
>>> c=257
>>> d=257
>>> print(id(c),id(d))
(44492764, 44471284)
>>> 

这将帮助您了解整数的意外行为。无论何时创建一个介于-5到256之间的Int,实际上只返回一个对现有对象的引用。这在python中称为整数缓存。

这并不能解释为什么每次分配
a=-5
时id都保持不变,但每次分配
a=-6
时id都会改变。您能提供一些参考吗?这是针对python3的,在CPython中,处理创建新int对象的C-API函数是
PyLong\u FromLong(long v)
。请参阅CPython解释器中有关内部优化原因的文档。这在代码中是不应该依赖的。