2016-06-15 39 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

不是我能找到的。 –

相關問題