为什么较大的int数返回不同的ID,有时返回相同的ID?
今天,我了解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上进行了测试。