ドキュメントには、__hash__
メソッドとメソッドが定義されている限り、クラスはハッシュ可能であると書かれています__eq__
。でも:
class X(list):
# read-only interface of `tuple` and `list` should be the same, so reuse tuple.__hash__
__hash__ = tuple.__hash__
x1 = X()
s = {x1} # TypeError: unhashable type: 'X'
何がX
ハッシュ不可能なのか?
同じ値にハッシュするには、(通常の等価性に関して) 同一のリストが必要であることに注意してください。そうしないと、ハッシュ関数に関するこの要件に違反します。
唯一の必要なプロパティは、等しいと比較されるオブジェクトは同じハッシュ値を持つということです
ドキュメントは、ハッシュ可能なオブジェクトをその存続期間中に変更してはならないことを警告しています。もちろん、X
作成後のインスタンスは変更しません。もちろん、インタプリタはとにかくそれをチェックしません。