なぜ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. 文字列インターンとreferenceEquals
- 3. Python 2.7.5でインターンされた文字列の数を調べる方法は?
- 4. インターンのpython値
- 5. インターン文字列はパーサーのパフォーマンスを向上させますか?
- 6. メモリ効率のよいC++文字列(インターン、ロープ、コピーオンライトなど)
- 7. Python - 文字列内の非アスキー文字を置換する(»)
- 8. Python 2.7バイト文字列内の非ASCII文字
- 9. 宣言的プログラミングにおけるインターン文字列
- 10. 文字列への非汎用IEnumerable
- 11. :: Pythonの文字列
- 12. のPython - 文字列
- 13. のPython:文字列
- 14. のPython - 文字列
- 15. のpython文字列
- 16. 使用インターンは
- 17. 文字列インターンは実行の間に共有されていますか?
- 18. Pythonの利用機能文字列
- 19. 文字列のPython特殊文字
- 20. Pythonでは、別々の辞書文字列値が等価チェックで "in"を渡すのはなぜですか? (文字列インターン実験)
- 21. SonarQube非定数文字列
- 22. 非常に長い文字列のページ設定Django 1.11(Python 3.6)
- 23. Python SQLite非存在行のデフォルト文字列を返す
- 24. 文字列内の最初の非数字文字の位置
- 25. Pythonは - 文字列
- 26. Pythonフィルタリング文字列
- 27. Python文字列FIFO
- 28. Pythonリピート文字列
- 29. Python文字列スライス
- 30. 文字列パターンマッチPython
不変オブジェクトのために 'intern'のようなオブジェクトキャッシュを作成することができます。 –
@Peter:そうです。 'intern'の利点は、そのためのコードはすべて自動的に生成され、ボーナスとしては高速なC++であることです。 –
@NeilG私はそうは思わない。 AFAIK CPythonはC++ではなく完全にCで書かれています。 – glglgl