2011-08-03 66 views
8

爲什麼Python的intern僅內置於字符串?應該可以將intern擴展爲可哈希和可比較的類,對嗎?Python實習生非字符串

+1

您可以爲不可變對象創建一個像「intern」這樣的對象緩存。 –

+0

@彼得:你說得對。 'intern'的優點是所有的代碼都是自動生成的,作爲獎勵,它使用的是C++。 –

+2

@NeilG我不這麼認爲。 AFAIK CPython完全用C編寫,而不是C++。 – glglgl

回答

14

實習內容的目的是通過比較它們的內存地址來比較它們;您確保永遠不會創建具有相同值的兩個對象(當程序請求創建與現有對象具有相同值的第二個對象時,它將接收對已有對象的引用)。這要求你實習的東西是不可變的;如果被攔截的對象的值可能發生變化,則通過地址比較它們是行不通的。

在Python中,不可能強制用戶定義的類實例的不可變性,所以實習它們是不安全的。我懷疑這是實習生不包括班級實例的主要理論原因。

其他內置在不可變的類型是在一個機器級操作已經(整數,浮點等等),或者不可變容器,其可以包含可變值(元組,frozenset)可比較。沒有必要實習前者,後者也不能安全實習。

+0

+1。 「在Python中,不可能強制用戶定義的類實例的不可變性」 - 這是多麼不幸。 – ShreevatsaR

0

只支持字符串,因爲interning依賴於基於指針的object identity test。其他類型的哈希可以進行比較,但對象本身永遠不會匹配身份測試。這是事實,因爲即使它們可能相同,它們也不是同一個對象。

Reference

+3

據我所知,基於指針的對象身份測試是你通過實習獲得的好處,而不是實習生所需要的。如果你要求實習對象,你本質上會考慮其中任何兩個具有相同價值的人具有相同的身份(我相信當Neil G說「可拆分和可比較」時,他會得到這個身份)。這又要求它們是不可變的,這不是Python中的類實例的強制性屬性。我想這是它不被支持的主要理論原因。 – Ben

+0

@Ben:這是對我的問題的一個很好的解釋。另外,你的最後一點可能是這個問題的答案。隨意添加一個答案。 –

1

不存在技術原因,比方說,一個元組不能被拘留,但我會想象在現實世界中,這是沒有什麼價值的比較字符串文字,這將是連用戶定義類型的實際價值較低。使其工作可能不被認爲是值得的努力。

+5

元組的內容可以是可變的。實習元組可能會導致奇怪的行爲。例如。 'a,b =([]),([]);一個[0] .append('foo')'會有不同的結果,這取決於「a」和「b」是否取決於元組實施實現的不同元組。顯然Fortran的一些實現[做了類似的事情](http://stackoverflow.com/questions/1995113/strangest-language-feature/1995476#1995476)。 –

+2

@彼得:實習的整個想法是,只有當你沒有描述的副作用時,你才能做到這一點。實習元組顯然必須檢查以確保所有元素與已經實現的元組是相同的對象,而不僅僅是相等的。它實際上可能試圖首先實習元素(如果數字類型也是內部的,這將更有用)。在你的例子中,如果元組不包含相同的列表,那麼它們根本無法共享引用。沒有技術上的原因,爲什麼Python無法修改來完成這一切。 – kindall