今天,我了解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个字节。
int
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上进行了测试。
作为一种优化,Python会预先创建一系列int对象(我认为默认情况下为-5 … 256,这是一个编译时选项),并且始终优先使用这些对象来创建新的int。对于超出此范围的int,再次需要完全相同的int的机会被认为太低,因此不值得花精力检查所需的int对象是否已经存在。
这纯粹是一个实现细节。如果您的代码实际上关心过它,那么您就在做某件事。