Pythonの基本的なデータ構造の1つは辞書です。これにより、任意のタイプの「値」を検索するための「キー」を記録できます。これはハッシュテーブルとして内部的に実装されていますか?そうでない場合、それは何ですか?
はい、ハッシュマッピングまたはハッシュテーブルです。ティムピーターズによって書かれた、Pythonのdict実装の説明を読むことができます here 。
そのため、リストのような「ハッシュできない」ものをdictキーとして使用することはできません。
>>> a = {}
>>> b = ['some', 'list']
>>> hash(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list objects are unhashable
>>> a[b] = 'some'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list objects are unhashable
ハッシュテーブルの詳細を読む または pythonでの実装方法を確認する および そのように実装する理由 .
Python辞書には、hash()でのテーブルルックアップ以上のものが必要です。野bruな実験により、私はこれを見つけましたハッシュ衝突:
>>> hash(1.1)
2040142438
>>> hash(4504.1)
2040142438
まだ辞書を壊しません:
>>> d = { 1.1: 'a', 4504.1: 'b' }
>>> d[1.1]
'a'
>>> d[4504.1]
'b'
サニティーチェック:
>>> for k,v in d.items(): print(hash(k))
2040142438
2040142438
おそらくhash()以外に、辞書キー間の衝突を回避する別のルックアップレベルがあります。または、dict()は別のハッシュを使用する場合があります。
(ところで、これはPython 2.7.10。にありますPython 3.4.3および3.5.0に同じストーリーがあり、hash(1.1) == hash(214748749.8)
に衝突します。)
はい。内部的には、Z/2上の原始多項式に基づくオープンハッシュとして実装されます( source )。
Noskloの説明を拡張するには:
a = {}
b = ['some', 'list']
a[b] = 'some' # this won't work
a[Tuple(b)] = 'some' # this will, same as a['some', 'list']