首页 > 解决方案 > 大于 256 且小于 -5 的数字的整数缓存

问题描述

我知道 python 有一个小整数的概念,它们是从-5to的数字256,如果两个变量分配给这个范围之间的相同数字,它们都将使用相同的底层对象。

从 Python 文档中,

#ifndef NSMALLPOSINTS
#define NSMALLPOSINTS           257
#endif
#ifndef NSMALLNEGINTS
#define NSMALLNEGINTS           5
#endif

/* 小整数在此数组中预先分配,以便它们可以共享。预分配的整数是 -NSMALLNEGINTS(包括)到 NSMALLPOSINTS(不包括)范围内的整数。*/

这里也解释了,

当前的实现为 -5 到 256 之间的所有整数保留一个整数对象数组,当您在该范围内创建一个 int 时,您实际上只是取回了对现有对象的引用。所以应该可以改变 1 的值。我怀疑 Python 在这种情况下的行为是未定义的。:-)

例子,

a = 255
b = 255
print(id(a))
print(id(b))

给出相同的ID,

1561854394096
1561854394096

这是有道理的,也解释了这个答案,“是”运算符对整数的行为出乎意料

如果两个数字小于-5,它们也应该有不同的 ID,如下所示,

a = -6
b = -6
print(id(a))
print(id(b))

给,

2827426032208
2827426032272

到目前为止,这是有道理的,

但是任何大于256应该有不同的数字id

这应该返回不同的 ID,

a = 257
b = 257
print(id(a))
print(id(b))

但它没有

2177675280112
2177675280112

即使我使用非常大的整数,ID 也是相同的,

a = 2571299123876321621378
b = 2571299123876321621378
print(id(a))
print(id(b))

给我,

1956826139184
1956826139184

有人可以告诉我为什么大于 256 的数字具有相同的 ID,即使在 Python 代码中范围是-5257不包括在内)

编辑:

我尝试在 Python 2.7 和 3.6 中使用 PyCharm。也在 PythonTutor.com 上试过

标签: pythoncaching

解决方案


在薄荷 Python 3.6.3(以及 2)上,我无法重现。我的猜测是PyCharm或者 pythontutor 在解释之前将运行包装在一些东西中 - 因为这些不是开放代码,我们看不到内部,所以我无法验证。我认为这是真的原因是 while(下面的一切都是 mint Python 3):

>>> x=2571299123876321621378
>>> y=2571299123876321621378
>>> print(id(x),id(y))
140671727739528 140671727739808

你可以有这个:

>>> def bla():
...  x=2571299123876321621378
...  y=2571299123876321621378
...  id(x)
...  print(id(x),id(y))
...
>>> bla()
140671727742528 140671727742528

因此将两个整数包装在解释器可以编译的东西中允许这些额外的优化——比如对两个定义使用相同的常量。请注意,这也是有限的:

>>> def bla():
...  x=2571299123876321621378
...  y=2571299123876321621378
...  print(id(x),id(y))
...  x+=1
...  y+=1
...  print(id(x),id(y))
...
>>> bla()
140671727755592 140671727755592
140671728111088 140671728108808

我不会有任何依赖于此的代码 - 保证仅在 -5 到 256 之间。


推荐阅读