同一性と平等性: 比較の難題を解明する
プログラミングの領域では、データの比較は不可欠なタスクとなる場合があります。ただし、文字列の場合、比較に「==」または「is」演算子を使用すると、プログラマは予期しない結果に遭遇することがよくあります。この不可解な現象を詳しく調べて、s1 == s2 と s1 が s2 の出力が異なる理由を調べてみましょう。
ジレンマ
次の Python コードを考えてみましょう。
s1 = 'text' s2 = 'text'
直感的には、両方の s1 が期待されるかもしれません。 == s2 と s1 は両方の変数に同じ文字列値が割り当てられているため、s2 は True を返します。ただし、s1 == s2 は一貫して True を返し、等しいことを示しますが、s1 is s2 は驚くべきことに場合によっては False を返します。
真実を明らかにする
この動作を理解するには、次のようにします。同一性テスト (「is」によって実行される) と等価性テスト (「is」によって実行される) を区別することが重要です。 「==」)。同一性テストでは、2 つの変数がメモリ内のまったく同じオブジェクトを参照しているかどうかが判断され、等価性テストでは、それらの値が同一であるかどうかが検証されます。
Python インタープリタでは、同じ文字列値を複数の変数に代入する場合、次のようになります。上の例では、Python は文字列値をメモリ内の 1 つの場所に保存し、すべての変数をその場所にリンクすることでスペースを最適化します。これは、s1 と s2 が同じオブジェクトを参照しているため、値が等しいことを意味します。
ただし、Python はインターニングと呼ばれるメカニズムも実装しており、特定の共通の文字列値が共有プールに保存されます。インターン値を含む新しい文字列が作成されると、Python は新しいメモリ位置を割り当てる前に、その値がプールにすでに存在するかどうかを確認します。存在する場合、既存の場所が使用され、複数の文字列変数が同じメモリの場所を効果的にポイントできるようになります。
インターンの役割
' の場合text' の場合、これはインターンされた文字列値であり、s1 と s2 の両方がメモリ内の同じインターンされた値を参照することを意味します。その結果、s1 == s2 は True を返し、値が等しいことが確認されます。
ただし、s1 が s2 で False を返す場合がある理由は、Python による代入の処理方法にあります。インターンされていない文字列値を変数に割り当てると、その文字列に新しいメモリ位置が割り当てられます。これは、同じ値を持っているにもかかわらず、2 つの変数がメモリ内の同じオブジェクトを参照しなくなったことを意味します。したがって、s1 は s2 と False に評価され、それらが同じオブジェクトではないことを示します。
本質
同一性テストと等価性テストの違いを理解することは、「==」または「is」を使用して文字列を比較すると異なる結果が生じる理由を理解する上で重要です。 s1 == s2 は文字列値の同一性を比較し、s1 は s2 が変数がメモリ内で参照するオブジェクトの同一性を比較します。
以上がPython で文字列を比較するときに、「s1 == s2」と「s1 is s2」が異なる結果を返す場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。