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

时间:2018-11-06 08:17:08

标签: python caching

我知道python有一个小整数的概念,它们是从-5256的数字,如果两个变量在该范围内分配相同的数字,它们都将使用相同的基础对象。

从Python文档中

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

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

explained here,

  

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

示例

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

赋予相同的ID,

1561854394096
1561854394096

这是有道理的,并在此答案上作了解释,"is" operator behaves unexpectedly with integers

如果两个数字小于-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

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

编辑:

我尝试将PyCharm与Python 2.7和3.6结合使用。还尝试过PythonTutor.com

1 个答案:

答案 0 :(得分:0)

在薄荷Python 3.6.3(以及2)上,我无法复制。我的猜测是PyCharm或pythontutor在解释之前将运行结果包装起来了-由于这些不是开放代码,我们看不到内部信息,因此无法验证。我认为这是对的,这是因为(以下所有内容都是薄荷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。