python - 大于 256 且小于 -5 的数字的整数缓存
问题描述
我知道 python 有一个小整数的概念,它们是从-5
to的数字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 代码中范围是-5
(257
不包括在内)
编辑:
我尝试在 Python 2.7 和 3.6 中使用 PyCharm。也在 PythonTutor.com 上试过
解决方案
在薄荷 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 之间。
推荐阅读
- ios - 为什么我的导航栏在 iOS 13 中是全白的?
- opengl - 延迟管道中的体素锥跟踪?
- ios - 不寻常的 CollectionView moveItem 行为
- python - 我应该从哪里开始使用 webrtc 将 hololens 流式传输到 python 服务器?
- r - 如何在 R 中按值平均秒分组
- plaintext - 实数 CKKS Encoding Microsoft SEAL 明文形式
- django - Django 管理员不允许超级用户登录(自定义用户模型)
- xamarin - Prism,从 AppDelegate 访问 DryIoC 容器
- python - 如何在python上查询ELK中的公共IP?
- c++ - 无法将空初始值设定项分配给 unique_ptrs 的向量