Python 大于256且小于-5的数字的整数缓存

Python 大于256且小于-5的数字的整数缓存,python,caching,Python,Caching,我知道python有一个小整数的概念,它是从-5到256的数字,如果两个变量在这个范围内分配给相同的数字,它们都将使用相同的底层对象 来自Python文档, #ifndef NSMALLPOSINTS #define NSMALLPOSINTS 257 #endif #ifndef NSMALLNEGINTS #define NSMALLNEGINTS 5 #endif /*小整数在此数组中预先分配,以便 分享。预分配的整数是 范围-NSMALLNEGI

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

来自Python文档,

#ifndef NSMALLPOSINTS
#define NSMALLPOSINTS           257
#endif
#ifndef NSMALLNEGINTS
#define NSMALLNEGINTS           5
#endif
/*小整数在此数组中预先分配,以便 分享。预分配的整数是 范围-NSMALLNEGINTS(包括)到NSMALLPOSINTS(不包括)。 */

当前实现为所有对象保留一个整数对象数组 介于-5和256之间的整数,当您在该范围内创建整数时 实际上,只需返回对现有对象的引用。所以 应该可以更改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代码中范围是
-5
257
(不包括在内)

编辑:

我已经尝试在Python2.7和3.6中使用PyCharm。也在PythonTutor.com上试用了mint Python 3.6.3(也是2版),但我无法复制。我猜是
PyCharm
或者pythontutor在解释之前正在将运行包装到某个东西中-因为这些不是打开的代码,我们无法看到内部,所以我无法验证。我认为这是正确的原因,是while(以下所有内容都是mint Python 3):

您可以选择:

>>> 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之间。

从逻辑角度来看,从-5到256之间的数字具有相同ID的信息不会告诉您任何关于此范围之外整数ID的信息。如果您检查此问题的答案,它过去是,任何大于
256
的数字过去都有不同的
id
@EricDuminil,这是否意味着python现在缓存每个可能的整数
=-5
无法在python 3.6.3上重现(在最后两个示例中,我得到了不同的id)。Python2也一样。你确定这就是你测试它的方式吗?我使用Python3.6在PyCharm上运行了它,也在PyCharm上进行了测试
>>> 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