[解決済み] なぜPythonのdictは同じハッシュを持つ複数のキーを持つことができるのですか?
質問
私はPythonの
hash
関数を理解しようとしています。私は、すべてのインスタンスが同じハッシュ値を返すカスタムクラスを作成しました。
class C:
def __hash__(self):
return 42
上記のクラスのインスタンスは1つしかないと思い込んでいて、そのインスタンスを
dict
にあるものと思っていましたが、実際には
dict
は同じハッシュを持つ複数の要素を持つことができます。
c, d = C(), C()
x = {c: 'c', d: 'd'}
print(x)
# {<__main__.C object at 0x7f0824087b80>: 'c', <__main__.C object at 0x7f0823ae2d60>: 'd'}
# note that the dict has 2 elements
もう少し実験してみたところ、この部分をオーバーライドすると
__eq__
メソッドをオーバーライドすると、クラスのすべてのインスタンスが等しく比較されます。
dict
は一つのインスタンスしか許しません。
class D:
def __hash__(self):
return 42
def __eq__(self, other):
return True
p, q = D(), D()
y = {p: 'p', q: 'q'}
print(y)
# {<__main__.D object at 0x7f0823a9af40>: 'q'}
# note that the dict only has 1 element
そこで気になるのは、どのように
dict
が同じハッシュを持つ複数の要素を持つことができるのかを知りたいのです。
どのように解決するのですか?
Pythonのハッシュがどのように動作するかの詳細な説明については、私の答えを参照してください。 なぜearly returnは他のものより遅いのですか?
基本的にはハッシュを使用してテーブルのスロットを選択します。スロットに値があり、ハッシュが一致する場合、項目が等しいかどうか比較します。
ハッシュは一致するが、項目が等しくない場合、別のスロットを試行します。これを選択する公式があり (参照された回答で説明しています)、ハッシュ値の未使用部分を徐々に引き込みますが、それらをすべて使い切ると、最終的にハッシュ テーブルのすべてのスロットを介して動作します。つまり、最終的に一致する項目が見つかるか、空のスロットが見つかるかが保証されているのです。検索は空のスロットを見つけると、値を挿入するか、あきらめます(値を追加するか、取得するかによって異なります)。
注意すべき重要な点は、リストやバケットが存在しないことです。特定の数のスロットを持つハッシュテーブルが存在し、各ハッシュは一連の候補スロットを生成するために使用されています。
関連
-
[解決済み] Pythonで "with open "を使って複数のファイルを開くにはどうしたらいいですか?
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] Pythonを使ってシステムのホスト名を取得するにはどうすればよいですか?
-
[解決済み】Pythonで複数のコンストラクタを持つためのクリーンでPythonicな方法は何ですか?
-
[解決済み] Pythonでリストからキーと空の値でdictを初期化する方法は?
-
[解決済み] Pythonのマルチプロセッシングプールimap_unorderedの呼び出しの進捗を表示しますか?
-
[解決済み] Pythonのインスタンス変数とクラス変数
-
[解決済み] Python 2.7サポート終了?
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
-
[解決済み] Python の sorted() はどのようなアルゴリズムを使っているのですか?重複
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] なぜアーリーリターンは他より遅いのか?
-
[解決済み] Pythonの要素別タプル演算(sumなど
-
[解決済み] Pandasの'Freq'タグにはどのような値が有効ですか?
-
[解決済み] データフレームをソートした後にインデックスを更新する
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] PyMongoで.sortを使用する
-
[解決済み] 異なる順序で同じ要素を持つ2つのJSONオブジェクトを等しく比較するには?
-
[解決済み] Pandasのデータフレーム内の文字列を'date'データ型に変換するにはどうしたらいいですか?
-
[解決済み] if 節の終了方法
-
[解決済み] virtualenvsはどこに作成するのですか?