2016-06-15 40 views
2

我想知道什么可能是这种现象的原因(CPython的2.7和3.5):CPython的字符串长度超过21个字符大 - 内存分配

>>> a = 's' ; b = 's' 
>>> id(a), id(b) 
(4322870976, 4322870976) 

字符串超过21个字符短,似乎共享相同的内存地址(或ID)。

>>> a = 's' * 20 ; b = 's' * 20 
>>> id(a), id(b) 
(4324218680, 4324218680) 

从21开始,此行为发生变化。

>>> a = 's' * 21 ; b = 's' * 21 
>>> id(a), id(b) 
(4324218536, 4324218608) 

我没能找到一个合理的解释,但根据python docs

例如,经过= 1; B = 1,A和B可能会或可能不会指向同一个对象与价值之一,根据实施...

找过cpython's code后,我找不到这个地方做出决定。

回答

3

Python编译器converts尽可能多的表达式,并且对于字节码中的常量(即它实现它们)有意义。具有相同值的常量将通过该过程具有相同的id()。这给出了第一个和第二个例子的结果。

但我们必须符合“有意义”。较大的表达式(例如10**100)会导致大量用于其常量结果的空间。这意味着编译器包含字节码中未修改的表达式,并在运行时计算它们的值。对于字符串(实际上全部为类型),最大长度为20,因此第三个示例中的表达式由VM而不是编译器评估。

+0

任何理由20? –

+0

不是我能找到的。 –

相关问题