爲什麼Python的intern
僅內置於字符串?應該可以將intern
擴展爲可哈希和可比較的類,對嗎?Python實習生非字符串
回答
實習內容的目的是通過比較它們的內存地址來比較它們;您確保永遠不會創建具有相同值的兩個對象(當程序請求創建與現有對象具有相同值的第二個對象時,它將接收對已有對象的引用)。這要求你實習的東西是不可變的;如果被攔截的對象的值可能發生變化,則通過地址比較它們是行不通的。
在Python中,不可能強制用戶定義的類實例的不可變性,所以實習它們是不安全的。我懷疑這是實習生不包括班級實例的主要理論原因。
其他內置在不可變的類型是在一個機器級操作已經(整數,浮點等等),或者不可變容器,其可以包含可變值(元組,frozenset)可比較。沒有必要實習前者,後者也不能安全實習。
+1。 「在Python中,不可能強制用戶定義的類實例的不可變性」 - 這是多麼不幸。 – ShreevatsaR
只支持字符串,因爲interning依賴於基於指針的object identity test。其他類型的哈希可以進行比較,但對象本身永遠不會匹配身份測試。這是事實,因爲即使它們可能相同,它們也不是同一個對象。
據我所知,基於指針的對象身份測試是你通過實習獲得的好處,而不是實習生所需要的。如果你要求實習對象,你本質上會考慮其中任何兩個具有相同價值的人具有相同的身份(我相信當Neil G說「可拆分和可比較」時,他會得到這個身份)。這又要求它們是不可變的,這不是Python中的類實例的強制性屬性。我想這是它不被支持的主要理論原因。 – Ben
@Ben:這是對我的問題的一個很好的解釋。另外,你的最後一點可能是這個問題的答案。隨意添加一個答案。 –
不存在技術原因,比方說,一個元組不能被拘留,但我會想象在現實世界中,這是沒有什麼價值的比較字符串文字,這將是連用戶定義類型的實際價值較低。使其工作可能不被認爲是值得的努力。
元組的內容可以是可變的。實習元組可能會導致奇怪的行爲。例如。 'a,b =([]),([]);一個[0] .append('foo')'會有不同的結果,這取決於「a」和「b」是否取決於元組實施實現的不同元組。顯然Fortran的一些實現[做了類似的事情](http://stackoverflow.com/questions/1995113/strangest-language-feature/1995476#1995476)。 –
@彼得:實習的整個想法是,只有當你沒有描述的副作用時,你才能做到這一點。實習元組顯然必須檢查以確保所有元素與已經實現的元組是相同的對象,而不僅僅是相等的。它實際上可能試圖首先實習元素(如果數字類型也是內部的,這將更有用)。在你的例子中,如果元組不包含相同的列表,那麼它們根本無法共享引用。沒有技術上的原因,爲什麼Python無法修改來完成這一切。 – kindall
- 1. Python實習生字符串?
- 2. 試圖複製Python的字符串實習的功能對於非字符串
- 3. 字符串實習生API文檔
- 4. 字符串實習生的行爲?
- 5. Python字符串實習和子
- 6. 實習生字串誤解?
- 7. 通過實習字符串
- 8. 實習相關字符串
- 9. 自動實習字符串文字
- 10. 同步上的實習字符串
- 11. Java中的實習字符串
- 12. HDF做字符串實習嗎?
- 13. 實習空字符串錯誤
- 14. 的java字符串連接和實習
- 15. 字符串實習表現問題
- 16. Java中的字符串比較和字符串實習
- 17. C#字符串連接和字符串實習
- 18. 符號所生產實習生
- 19. Python,將非字符串對象表示爲字符串?
- 20. 字符串實習和字面字符串聲明的搜索開銷
- 21. 與實習生
- 22. Python排序非邏輯字符串
- 23. 散列非ASCII Python字符串
- 24. 字符串替換練習
- 25. 常用的JavaScript實現是否使用字符串實習?
- 26. 在.NET中字符串實習和字符串合併有什麼區別?
- 27. 如何提供python類的非正式字符串表示形式(非實例)
- 28. 從python中的不同字符串生成'random'字符串?
- 29. Python非ASCII字符
- 30. 是否有可能讀取實習生池中的所有字符串?
您可以爲不可變對象創建一個像「intern」這樣的對象緩存。 –
@彼得:你說得對。 'intern'的優點是所有的代碼都是自動生成的,作爲獎勵,它使用的是C++。 –
@NeilG我不這麼認爲。 AFAIK CPython完全用C編寫,而不是C++。 – glglgl