前書き
2 つの演算子 is と == の違いについて説明する前に、まず Python のオブジェクトに含まれる 3 つの基本要素、つまり id (アイデンティティ)、python type() (データ型)、および value (価値)。 is と == は両方ともオブジェクトの比較と判定に使用されますが、オブジェクトの比較と判定の内容が異なります。具体的な違いを見てみましょう。
Python では 2 つのオブジェクトが等しいかどうかを比較する方法が 2 つあり、その違いは簡単に言うと次のとおりです。
は 2 つの参照が同じオブジェクトを指しているかどうかを比較する (参照比較) です。
== は 2 つのオブジェクトが等しいかどうかを比較します。
>>> a = [1, 2, 3] >>> b = a >>> b is a # a的引用复制给b,他们在内存中其实是指向了用一个对象 True >>> b == a # 当然,他们的值也是相等的 True >>> b = a[:] # b通过a切片获得a的部分,这里的切片操作重新分配了对象, >>> b is a # 所以指向的不是同一个对象了 False >>> b == a # 但他们的值还是相等的 True
実装原理
は、両者が同じオブジェクトであるかどうかを比較するので、比較されるのはメモリアドレス(idが同じかどうか)です。
== は値の比較です。 int、str などの不変オブジェクトは、値の比較を直接実行します。 Python に既知のオブジェクトの場合、比較のために __eq__ 関数が呼び出されます。 (実際には、既知のオブジェクトも組み込みの __eq__ 関数を通じて比較する必要があります)。カスタム オブジェクトの場合、__eq__ 関数が実装されている場合は比較されます。実装されていない場合、結果は == と同じになります。
オブジェクト キャッシュ メカニズム
Python は、次に小さいオブジェクトが使用されるときにキャッシュ領域を検索し、見つかった場合は新しいメモリを開きませんが、キャッシュを継続します。小さなオブジェクトのアドレスに新しい値が割り当てられます。例:
>>> c = 1 >>> d = 1 >>> print(c is d) True >>> 1000 is 10**3 False >>> 1000 == 10**3 True
代入は計算され、バッファ領域を使用しません。これは最初のコード例からわかります。
文字列の場合、intern 関数を使用してバッファの使用を強制できます。