如果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解释器中有关内部优化原因的文档。这在代码中是不应该依赖的。