小编典典

为什么较大的int数返回不同的ID,有时返回相同的ID?

python

今天,我了解id并决定将其使用和测试。我知道整数是不可变的,因此id应该是(?)相同。但是,当我在提示中进行测试时,我注意到了一些细微的差异,并想找出其背后的原因。

a = 1
id(a)    # 10055552
id(1)    # 10055552
a = int(1)
id(a)    # 10055552

凉!到目前为止,所有签出。但是之后…

a = 10000
id(a)           # 140230117375888
id(10000)       # 140230116779920
a = int(10000)
id(a)           # 140230116779920

# wait what?? try it again
id(10000)       # 140230116780080
# Huh!?

好的,所以测试一下,我注意到此行为一直持续到256年。id最多可以是8位数字,然后257将返回更大的id,可以是15位数字。因此int类型必须是8个字节。

a = 256
id(a)     # 10063712
id(256)   # 10063712

a = 257
id(a)     # 140230116780080
id(257)   # 140230117375888
a = int(257)
id(a)     # 140230117375888
id(257)   # 140230116779920

所以我发现它与8个字节长有关,但是任何大于256的东西都会重新使用某些相同的id:

140230116780080
140230116780048
140230116780144
140230117375888
140230116779920

请注意,以上列表并不详尽。

引擎盖下面发生了什么?为什么某些ID被重复使用?测试多个变量:

a = 257
b = 258
c = 259

id(a)      # 140230116780176
id(257)    # 140230116779984   <--- reused?
id(b)      # 140230116780080
id(258)    # 140230116780144
id(c)      # 140230116780048
id(259)    # 140230116779984   <--- reused?

id(257) == id(259)    # False

TL; DR-
对于大于256的整数,为什么要重用某些ID?我以为这些ID在他们的一生中应该是唯一的,但是其中一些ID看起来一样,但是在比较它们时,它们是不同的吗?请查看提供的最后一个示例。

另外,为什么对于这些​​较大的整数使用少数几个ID?对于使用更多变量的系统,这可能有所不同吗?

在Python 3.4.3,Linux上的GCC 4.8.4上进行了测试。


阅读 290

收藏
2021-01-20

共1个答案

小编典典

作为一种优化,Python会预先创建一系列int对象(我认为默认情况下为-5 …
256,这是一个编译时选项),并且始终优先使用这些对象来创建新的int。对于超出此范围的int,再次需要完全相同的int的机会被认为太低,因此不值得花精力检查所需的int对象是否已经存在。

这纯粹是一个实现细节。如果您的代码实际上关心过它,那么您就在做某件事。

2021-01-20