Python では、'is' 演算子は文字列の等価性をテストするためによく使用されます。ただし、その実装は、「__eq__」などの他の等価演算子とは異なります。この記事では、Python 内で 'is' がどのように動作するかの複雑さを探ります。
コンテンツの同等性をチェックする '__eq__' とは異なり、'is' は同一性を評価します。文字列を扱う場合、これは、2 つの文字列が同じメモリ位置を占有するかどうかが「is」によって決定されることを意味します。
カスタム クラスで「is」の動作を模倣しようとすると、課題が発生します。 Python は特定の実装を期待しているため、「__is__」メソッドを定義するだけでは十分ではありません。 Python の期待に応えるには、文字列のインターンの性質を理解することが重要です。
インターンには、文字列オブジェクトを中央キャッシュに保存し、同じ文字列への複数の参照が単一の共有インスタンスを指すようにすることが含まれます。この最適化により、メモリ消費量が削減され、速度が向上するため、パフォーマンスが向上します。
Python では、'abc' のような文字列リテラルは自動的にインターンされます。したがって、(('abc' == 'abc') および ('abc' is 'abc')) は True と評価されます。ただし、カスタム文字列の場合は、インターンを明示的に実行する必要があります。
次の例は、インターンされた文字列とインターンされていない文字列を使用した 'is' と '__eq__' の違いを示しています。
<code class="python">>>> s = 'str' >>> s is 'str' True >>> class MyString: ... def __init__(self): ... self.s = 'string' ... def __eq__(self, s): ... return self.s == s ... >>> m = MyString() >>> m is 'string' False >>> sys.intern(m) is 'string' # After interning, 'is' returns True True</code>
To要約すると、「is」は Python のオブジェクトの同一性をチェックし、メモリの場所を比較します。ストリングスの場合、これはインターンが重要な役割を果たすことを意味します。インターンされた文字列は同じメモリ アドレスを共有するため、「is」が等しいかどうかを正しく判断できます。カスタム クラスに「is」を実装する場合、Python の動作を複製するには、インターンが適切に処理されることを確認することが不可欠です。
以上がPython の文字列を使用した「is」演算子の背後にある魔法とは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。