なぜPythonのintern
は文字列専用ですか? intern
をハッシュ可能で同等のクラスに拡張することは可能でしょうか?非文字列用のPythonインターン
答えて
物をインターンにする目的は、メモリアドレスを比較することによってそれらを比較できるようにすることです。同じ値を持つ2つのオブジェクトを決して作成しないようにします(プログラムが既存のオブジェクトと同じ値を持つ2番目のオブジェクトの作成を要求した場合、代わりに既存のオブジェクトへの参照を受け取ります)。これは、あなたが中止しているものが不変であることが必要です;インターンされたオブジェクトの値が変更される可能性がある場合、それらをアドレスで比較することは機能しません。
Pythonでは、ユーザ定義のクラスインスタンスの不変性を強制することはできないため、それらを中断することは安全ではありません。私はそれが、クラスのインスタンスをカバーしていない主な理論上の理由であると考えています。
不変タイプに内蔵された他は、すでに(整数、フロート、など)単一のマシンレベルの動作に匹敵する、またはが可変値(タプル、frozensetの)を含むことができる不変コンテナのいずれかです。前者をインターンにする必要はなく、後者を安全に拘禁することはできません。
+1。 「Pythonでは、ユーザ定義のクラスインスタンスの不変性を強制することはできません。どれほど残念ですか? – ShreevatsaR
インターンはポインタベースのobject identity testに依存しているため、文字列のみがサポートされています。他のタイプのクラスのハッシュを比較することはできますが、オブジェクト自体はアイデンティティテストと決して一致しません。これは同じでも同じオブジェクトではないため、当てはまります。
私が理解しているように、ポインタベースのオブジェクト同一性テストは、インターンで得られる利点であり、インターンのものに必要なものではありません。インターンのオブジェクトに依頼している場合、同じ価値を持つ2人のうち、同じ価値を持つものを本来持っていると考えています(Neil Gは、「ハッシュ可能で類似」と言います)。そのためには、それらが不変であることが必要です。これは、Pythonのクラスインスタンスの実行可能なプロパティではありません。私はそれがサポートされていない主な理論上の理由だと思います。 – Ben
@Ben:それは私の質問の良い解釈です。また、あなたの最後のポイントはおそらくこの質問の答えです。お気軽に回答を追加してください。 –
言う、私は現実の世界で、これは文字列リテラルに比べてほとんど価値があることを想像するだろうけれどもタプルは、インターンすることができませんでしたし、それもであろう、という技術的な理由はありませんユーザー定義の型では現実的でない価値があります。おそらく努力する価値があるとは考えられないでしょう。
タプルの内容は変更可能です。インターリングするタプルは奇妙な動作を引き起こす可能性があります。例えば。 'a、b =([])、([]); a [0] .append( 'foo') 'は、' a'と 'b'がタプル内部実装に依存する異なるタプルであるかどうかによって異なる結果を持つでしょう。どうやら、Fortranのいくつかの実装は[何か類似していました](http://stackoverflow.com/questions/1995113/strangest-language-feature/1995476#1995476)。 –
@Peter:インターナショナルという考えは、あなたが説明したような副作用がない場合にのみ行うことができます。タプルをインターンすることは、明らかに、すべての要素が単に同じではなく、すでにインターンされているタプルと同じオブジェクトであることを確認する必要があります。実際に要素を最初にインターンしようとする可能性があります(これは、数値型も内部に入れられると便利です)。あなたの例では、同じリストを含んでいなければ、タプルは単に参照を共有することができません。 Pythonをすべて修正することができなかった技術的な理由はありません。 – kindall
- 1. インターン文字列はパーサーのパフォーマンスを向上させますか?
- 2. メモリ効率のよいC++文字列(インターン、ロープ、コピーオンライトなど)
- 3. 文字列への非汎用IEnumerable
- 4. のPython:文字列
- 5. :: Pythonの文字列
- 6. のpython文字列
- 7. のPython - 文字列
- 8. 使用インターンは
- 9. 文字列のPython特殊文字
- 10. Pythonは - 文字列
- 11. Pythonリピート文字列
- 12. Python文字列FIFO
- 13. Python文字列スライス
- 14. Python文字列/マッチケース
- 15. SonarQube非定数文字列
- 16. pythonの文字列 '' ':文字列の中の単一の二重引用符
- 17. python - dictのリスト。文字列
- 18. のpython:文字列入力
- 19. Pythonの文字列フォーマット
- 20. Pythonの文字列クラスタリング
- 21. Python生の文字列
- 22. Pythonの文字列操作
- 23. 文字列のエンコーダ - Python
- 24. LibreOffice用のPythonマクロ - 文字列内の文字列を置き換えます。
- 25. Pythonの16進数文字列の文字列フォーマット
- 26. 文字列Pythonで別の文字列に分割
- 27. Pythonの文字列リストを文字列に変換する
- 28. Pythonは、複数の文字列に文字列を分割
- 29. Python Djangoエンコーディングエラー、 '\ xe5'非ASCII文字
- 30. Pythonで文字列から
不変オブジェクトのために 'intern'のようなオブジェクトキャッシュを作成することができます。 –
@Peter:そうです。 'intern'の利点は、そのためのコードはすべて自動的に生成され、ボーナスとしては高速なC++であることです。 –
@NeilG私はそうは思わない。 AFAIK CPythonはC++ではなく完全にCで書かれています。 – glglgl