2011-04-08 90 views
1

我能夠理解python的不變性(也非常簡單)。比方說,我給你一個數字python中不同變量的id值3

x = 42 
print(id(x)) 
print(id(42)) 

在這兩方面,我得到的值是

505494448 

我的問題是,確實Python解釋器配發的ID,以所有的數字,字母,真/在假環境加載之前的內存?如果沒有,那麼ID如何跟蹤?或者我以錯誤的方式看待這個問題?有人可以解釋嗎?

+3

從-5到255的小數字被實施 – 2011-04-08 07:23:38

+0

哦,那是我不知道的..謝謝你D.DD – harihb 2011-04-10 04:26:25

回答

6

你所看到的是一個實現細節(內部優化),調用實習。這是一種技術(用於包括Java和Lua在內的多種語言的實現),在可能或可行的情況下,將名稱或變量用作單引號對象。

你不應該依賴這種行爲。它不是語言正式規範的一部分,也不能保證單獨的字面引用到字符串或整數將被禁用,也不保證產生給定對象的給定的一組操作(字符串或數字)將被禁止針對其他相同的對象。

我聽說C Python實現確實包含了一組第一百個左右的整數作爲靜態實例化的不可變對象。我懷疑其他非常高級的語言運行時庫可能包括類似的優化:前100個整數被大多數非平凡的代碼片段使用得非常頻繁。

就實現這種情況而言......對於字符串和更大的整數,Python將它們作爲字典來維護是合理的。因此,任何表達式產生一個整數(甚至浮點數)和字符串(至少足夠短的字符串)將被散列,在適當的(內部)對象字典中查找,如果需要添加,然後作爲對結果對象的引用返回。

您可以通過將實例化包裝到您自己的類靜態字典中,實現自己喜歡的任何類型的自定義對象的類似實習。

+0

感謝您的明確解釋! – harihb 2011-04-08 11:26:16