2016-04-14 16 views
3

例1:的Python不同的內存管理行爲和* .py文件

➜ /tmp cat t.py 
a = 250000000000 
b = 250000000000 
print id(a), id(b), id(a) == id(b) 
➜ /tmp python t.py 
140450848587992 140450848587992 True #(Why is True?) 

例2:

➜ /tmp python 
Python 2.7.10 (default, Oct 23 2015, 19:19:21) 
[GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> a = 250000000000 
>>> b = 250000000000 
>>> print id(a), id(b), id(a) == id(b) 
140443481339400 140443481339208 False #(I think it should be False) 

我知道Python有一個小整數緩存池(從 - 5到256),所以兩個大整數應該有不同的id。

在Python殼* .py文件運行時,如何解釋大整數的不同的行爲?

回答

3

如果我是Python解釋器讀取.py文件(如您的第一個示例中),我只會爲該編號分配一次內存,然後使ab指向此位置。

例如,解釋器讀取這個文件,看到兩個變量被分配了相同的值,並且認爲:「我是否想通過爲相同的值分配兩個部分來浪費內存?不,我不這樣做,我最好分配一個塊並存儲這個值「。所以,只有一個該值的副本,這就是爲什麼這些變量具有相同的ID。

在第二種情況下,Python 分配內存,因此在執行分配時,所以有兩塊內存具有相同的數據。

綜上所述,在解釋器中有更多的瞭解的代碼(整個代碼中給出)第一種情況,因此它可以優化它(和生成.pyo文件),而在第二個也根本」不做任何優化。

2

其實CPython的運行時間確實「實習生」(高速緩存)一些不可改變的對象(整數達到一定值時,字符串可能是合法的Python標識符等)作爲優化。所有這些行爲都是完全依賴於實現的,並且不應該依賴於,正如你剛剛注意到的那樣。

+0

謝謝,現在我知道這個行爲完全依賴於實現! – virusdefender