python解释器如何决定id号?

时间:2014-08-28 17:26:01

标签: python python-2.7 interpreter python-internals

由于实习机制,我了解到id(1)总是一样的。

>>> id(1)
14710976
>>> id(1)
14710976
>>> 5
>>> id(1)
14710976
>>>

但是当我尝试 id(2000000000)时,如果连续执行id(2000000000),它也会实际执行,但是这个id在执行其他内容后会改变(例如,给打印一个数字)。并且每三次更改id就重用了id。

正如您在下面的会话中看到的,3个ID, 142989240 142989252 142989132

>>> id(2000000000)
142989240
>>> id(2000000000)
142989240
>>> 5
5
>>> id(2000000000)
142989252
>>> id(2000000000)
142989132
>>> 5
5
>>> id(2000000000)
142989132
>>> 5
5
>>> id(2000000000)
142989240
>>> 5
5
>>> id(2000000000)
142989252
>>> 5
5
>>> id(2000000000)
142989132
>>> 

第一个问题:为什么python每3次重用一次id?是否有任何担心python贡献者同意选择3,而不是2或4?我可以在python源代码中的哪个文件中找到3次实现?

第二个问题:

我发现实习两次

>>> id(2000000000)
161535928
>>> id(2000000000)
161535928
>>> 5
5
>>> id(2000000000)
161535940
>>> 5
5
>>> id(2000000000)
161535820

实习五次

>>> id(2000000000)
161195960
>>> id(2000000000)
161195960
>>> id(2000000000)
161195960
>>> id(2000000000)
161195960
>>> id(2000000000)
161195960
>>> 5
5
>>> id(2000000000)
161195972
>>> 5
5
>>> id(2000000000)
161195852

,然后接下来的2个ID将始终以相同的单个数字结尾。正如您在上面的会话中看到的,在id(2000000000)实习后,161535940和161535820都以数字0结束。在id(2000000000)实习5次后,161195972和161195852都以数字2结束。

但如果实习一次/三次/四次/六次,那么我总是得到 3个以不同数字结尾的ID 。正如您在下面的会话中所看到的,解释器会话显示140613560,140613476和140613572分别以0,6,2结尾。

>>> id(2000000000)
140613560
>>> id(2000000000)
140613560
>>> id(2000000000)
140613560
>>> 5
5
>>> id(2000000000)
140613476
>>> 5
5
>>> id(2000000000)
140613572

所以我的问题是,为什么会出现这种不断的行为以及它是如何实现的?

第3个问题:

与第二个问题相关,如果实习生两次或五次,则会发生特殊行为。

>>> id(2000000000)
141371320
>>> id(2000000000)
141371320
>>> 5
5
>>> id(2000000000)
141371332
>>> 5
5
>>> id(2000000000)
141371212
>>> 
>>> id(2000000000)
141371212
>>> 5
5
>>> id(2000000000)
141371236
>>> 5
5
>>> id(2000000000)
141371320

查看上面会话的中间部分,按ENTER键并保留空>>> ,并重新使用3个ID(请参阅第1个问题)! 141371320 - > 141371332 - > 141371212 成为 141371212 - > 141371236 - > 141371320 即可。我重现了这个步骤,并按照 141371320 - >的顺序找出 4个ID候选的总数。 141371332 - > 141371212 - > 141371236

我的问题是,为什么存在这种特殊行为?

0 个答案:

没有答案