web-dev-qa-db-ja.com

Python)での参照の同等性のテスト

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になります。

27
Adam Parkin

それがis演算子です

print f1 is f2

_f1 is f2_は、2つの参照が同じオブジェクトに対するものであるかどうかを確認します。内部的には、これはid組み込み関数を使用してid(f1) == id(f2)の結果を比較します。この関数は、オブジェクトに固有であることが保証されている整数を返します(ただし、オブジェクトの存続期間内のみ)。

CPythonでは、この整数はたまたまメモリ内のオブジェクトのアドレスですが、ドキュメントには、それを知らないふりをする必要があると記載されています(他の実装にはIDを生成する他のメソッドがある可能性があるため)。

3
Eli Collins

isキーワードを使用します。

print f1 is f2

isキーワードを使用したいくつかの興味深い点(実装に依存しますが、CPythonでは当てはまります)は、None、True、およびFalseがすべてシングルトンインスタンスであるということです。そう True is TrueはTrueを返します。

文字列もCPythonに組み込まれているため、'hello world' is 'hello world'はTrueを返します(通常のコードではこれに依存しないでください)。

2