ユーザー定義のクラス インスタンスの場合、is
はフォールバックとして使用されます。デフォルト__eq__
がオーバーライドされない場合、a == b
は として評価されa is b
ます。これにより、比較が常に結果を持つことが保証されます (NotImplemented
比較が明示的に禁止されている場合を除く)。
これは(やや斜めに-良いスポットSven Marnach)データモデルのドキュメントで参照されています(強調鉱山):
ユーザー定義のクラスには、デフォルトでメソッド__eq__()
とメソッドがあります。__hash__()
それらを使用すると、すべてのオブジェクトは等しくなく (それ自体を除く) 比較され、 thatとの両方を意味するような適切な値をx.__hash__()
返します。x == y
x is y
hash(x) == hash(y)
次のようにデモンストレーションできます。
>>> class Unequal(object):
def __eq__(self, other):
return False
>>> ue = Unequal()
>>> ue is ue
True
>>> ue == ue
False
soの__eq__
前に呼び出す必要がありますid
が、:
>>> class NoEqual(object):
pass
>>> ne = NoEqual()
>>> ne is ne
True
>>> ne == ne
True
そのため、定義されていないid
場所で呼び出す必要があります。__eq__
これは CPython implementationで確認できます。
/* If neither object implements it, provide a sensible default
for == and !=, but raise an exception for ordering. */
実装されている「賢明なデフォルト」v
は、ポインタとの C レベルの等値比較でありw
、これらが同じオブジェクトを指しているかどうかを返します。