1

__contains__要素に任意のオブジェクトを使用した場合、Pythonはリストに対してどのように機能しますか?isオペレーターに戻りますか?または__eq__、提供されている場合は使用しますか?

簡単なテストで

class Test: pass

print(Test() in [Test()]) # -> no
a=Test() 
print(a in [a])   # -> yes
print(a in [Test()])  # -> no

それで、それが参照による比較を使用すると仮定できますisか?

4

2 に答える 2

3

listのデフォルトの実装では、オブジェクトを()演算子__contains__と比較するだけです。クラスに定義されていない場合、デフォルトで。の動作になるのはこの演算子です 。==__eq__is

つまり、「ainlst」は次のようになります。

def contains(obj, lst):
   for item in lst:
       if obj == lst: 
          return True
   return False

contains(a, lst)

の動作は、を明示的に実装==するかどうかを変更し、それ以外の場合はデフォルトでオブジェクトID()を使用します。item__eq__is

于 2012-08-08T12:47:58.453 に答える
1

のドキュメントをobject.__contains__(self, item)参照してください:

メンバーシップテスト演算子を実装するために呼び出されます。アイテムが自分自身の場合はtrueを返し、そうでない場合はfalseを返す必要があります。オブジェクトのマッピングの場合、値やキーとアイテムのペアではなく、マッピングのキーを考慮する必要があります。

を定義しないオブジェクト__contains__()の場合、メンバーシップテストは最初にを介して反復を試行し__iter__()、次に、を介して古いシーケンス反復プロトコルを試行します__getitem__()。言語リファレンスのこのセクションを参照してください。

于 2012-08-08T12:42:43.390 に答える