2013-08-28 4 views
8

ドキュメントを見て、特にhttp://docs.python.org/2/reference/expressions.html#isを見ても、Pythonキーワードisの実装を定義するdunder/protocolメソッドはまだ見つかりません。どんな方法でそれを決定するのですか?私が理解するところでは、isはすべて、2つのオブジェクトで呼び出されたときのid関数の結果を比較することです。`is 'のPython dunderメソッド

+1

あなたは正しいです。 'id'はオブジェクトのメモリ位置を返します。したがって、オブジェクトをRAMの特定の場所に配置しない限り、独自の 'is'実装を書く必要はありません。 2つのオブジェクトの等価性をチェックする場合は、代わりに '__eq__'を使用してください – inspectorG4dget

+0

@ inspectorG4dgetありがとう! –

+4

私はちょうど[dunder](http://wiki.python.org/moin/DunderAlias)の意味を学びました! –

答えて

10

isのダンダー法はありません。あなたはそれを上書きすることはできません。それは意図的です。 isの全体点は、2つの式が同じ値を参照しているかどうかを示しています。したがって、定義上、2つの異なる値に対して、偽でなければなりません。したがって、それを無効にする必要はありません。 the docsとして

は、それを置く:

オペレータis及びオブジェクトIDのnot is試験:のみならXおよびyが同じオブジェクトである場合x is yが真です。

Data model docsにもう少しあります。)


また、isidの結果を比較しません。

idは、 "このオブジェクトの寿命中に一意で定数であることが保証されている整数"を返すように定義されています。つまり、isは確かにとなります。idとなりますが、どこに実装されているかわかりません。

CPythonでは、実質的にはカバーの下で同じことをします。はポインタが等しいことを確認し、idはポインタを整数にキャストして返します。だから、idを使って直接実装するか、それを実装するかの唯一の違いは、関数呼び出しの余分なペアと、マシンコードなしでコンパイルするキャストです。

しかし、他の実装でもそれは当てはまりません。 (明らかに、JythonとPyPyがポインタのようなものでさえない言語で書かれていると考えると)PyYyでは、isはRPythonオブジェクトが同じであることを確認します。idその場で生成されたキーを返します(後でidを同じ値にコールするとキャッシュされます)。

+0

待って、純粋なPythonの実装 'is'は、そのCのすべてのためにないですか? –

+0

@EdgarAroutiounian:CPythonではすべてC言語で書かれています。もちろん、他のPythonの実装では、Java、.NET、またはRPythonにあります。 – abarnert

+0

実装に関係なく、 'id(a)== id(b)' *は 'a is b'と同じ結果を返す必要があります...同意しますか? – nmclean

関連する問題