2016-12-01 3 views
2

衝突があった場合、Pythonはハッシュ衝突を解決します。 'a in s'は平等をチェックしないが、 'b in s'はどうしてですか? ハッシュ()とeq()の間のid()の呼び出しはありますか?なぜ、ハッシュは同じハッシュとアイデンティティを持つオブジェクトの等価性をチェックしませんか?

In [107]: class Foo(object): 
...:  def __eq__(self, other): 
...:   print "equality" 
...:   return False 
...:  def __ne__(self, other): 
...:   print "not equality" 
...:   return not self == other 
...:  def __hash__(self): 
...:   print "hash" 
...:   return 7 
...: a = Foo() 
...: b = Foo() 
...: s = set() 
...: 

In [108]: s.add(a) 
hash 

In [109]: a in s 
hash 
Out[109]: True 

In [110]: b in s 
hash 
equality 
Out[110]: False 
+0

cpythonでは、 'if(startkey == key)return entry;'というCの文で 'is/checkobject.c :: set_lookkey'で" is "チェックが行われます。 – tdelaney

+0

Pythonリファレンスをありがとう!その実装は私が探していたものでした。 –

答えて

2

Pythonコンテナは、すべての要素がそれ自身と等しいとみなします。彼らが使用する平等比較ルーチンは、より高価な==を試みる前にisチェックを行います。 a is a以降、==のチェックはスキップされます。

関連する問題