ユーザー定義のクラス インスタンスの場合、isはフォールバックとして使用されます。デフォルト__eq__がオーバーライドされない場合、a == bは として評価されa is bます。これにより、比較が常に結果を持つことが保証されます (NotImplemented比較が明示的に禁止されている場合を除く)。
これは(やや斜めに-良いスポットSven Marnach)データモデルのドキュメントで参照されています(強調鉱山):
ユーザー定義のクラスには、デフォルトでメソッド__eq__()とメソッドがあります。__hash__()それらを使用すると、すべてのオブジェクトは等しくなく (それ自体を除く) 比較され、 thatとの両方を意味するような適切な値をx.__hash__()返します。x == yx is yhash(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、これらが同じオブジェクトを指しているかどうかを返します。