8

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

4

1 に答える 1

11

のダンダーメソッドはありませんis。それをオーバーライドすることはできません。これは意図的なものです。要点isは、2 つの式が同じ値を参照しているかどうかを示すことです。したがって、定義により、2 つの異なる値に対して false である必要があります。したがって、それをオーバーライドする必要はありません。

ドキュメントにあるように:

xyが同じオブジェクトである場合にのみ、オブジェクト IDの演算子isとテストが true になります。not isx is y

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


また、isの結果を比較しませんid

id「このオブジェクトの存続期間中に一意で一定であることが保証されている整数」を返すように定義されています。つまり、is確かに を使用できますidが、それを使用する実装については知りません。

そうは言っても、CPython では、同じことを効果的に行っています — <a href="http://hg.python.org/cpython/file/3.3/Python/ceval.c#l4430" rel="noreferrer ">isは、ポインターが等しいことを確認し、ポインターをid整数にキャストして返します。したがって、直接実装する場合と経由で実装する場合の唯一の違いはid、追加の関数呼び出しのペアと、マシン コードにコンパイルされないキャストです…</p>

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

于 2013-08-28T19:21:04.417 に答える