Pythonに、属性が等しいかどうかを比較するために定義されたeqメソッドを持つクラスがあるとします。
class Foo(object):
# init code...
def __eq__(self, other):
# usual eq code here....
次に、Fooの2つのインスタンスを比較して、参照が等しいかどうかを確認するにはどうすればよいですか(つまり、それらが同じインスタンスであるかどうかをテストします)。私が行った場合:
f1 = Foo()
f2 = Foo()
print f1 == f2
それらは異なるオブジェクトですが、私はTrueになります。
それがis
演算子です
print f1 is f2
_f1 is f2
_は、2つの参照が同じオブジェクトに対するものであるかどうかを確認します。内部的には、これはid
組み込み関数を使用してid(f1) == id(f2)
の結果を比較します。この関数は、オブジェクトに固有であることが保証されている整数を返します(ただし、オブジェクトの存続期間内のみ)。
CPythonでは、この整数はたまたまメモリ内のオブジェクトのアドレスですが、ドキュメントには、それを知らないふりをする必要があると記載されています(他の実装にはIDを生成する他のメソッドがある可能性があるため)。
is
キーワードを使用します。
print f1 is f2
is
キーワードを使用したいくつかの興味深い点(実装に依存しますが、CPythonでは当てはまります)は、None、True、およびFalseがすべてシングルトンインスタンスであるということです。そう True is True
はTrueを返します。
文字列もCPythonに組み込まれているため、'hello world' is 'hello world'
はTrueを返します(通常のコードではこれに依存しないでください)。