Salah satu struktur data dasar dalam Python adalah kamus, yang memungkinkan seseorang untuk merekam "kunci" untuk mencari "nilai" dari jenis apa pun. Apakah ini diimplementasikan secara internal sebagai tabel hash? Jika tidak, apa itu?
Salah satu struktur data dasar dalam Python adalah kamus, yang memungkinkan seseorang untuk merekam "kunci" untuk mencari "nilai" dari jenis apa pun. Apakah ini diimplementasikan secara internal sebagai tabel hash? Jika tidak, apa itu?
Jawaban:
Ya, ini adalah pemetaan hash atau tabel hash. Anda dapat membaca deskripsi implementasi dict python, seperti yang ditulis oleh Tim Peters, di sini .
Itu sebabnya Anda tidak dapat menggunakan sesuatu yang 'tidak bisa diacak' sebagai kunci dict, seperti daftar:
>>> 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
Anda dapat membaca lebih lanjut tentang tabel hash atau memeriksa bagaimana hash diimplementasikan dalam python dan mengapa itu diterapkan seperti itu .
.keys()
dapat mengambil daftar kunci. Tabel hash asli tidak akan menyimpan kunci, hanya hash untuk menghemat ruang.
Harus ada lebih banyak ke kamus Python daripada pencarian tabel pada hash (). Dengan eksperimen kasar saya menemukan tabrakan hash ini :
>>> hash(1.1)
2040142438
>>> hash(4504.1)
2040142438
Namun itu tidak merusak kamus:
>>> d = { 1.1: 'a', 4504.1: 'b' }
>>> d[1.1]
'a'
>>> d[4504.1]
'b'
Cek kewarasan:
>>> for k,v in d.items(): print(hash(k))
2040142438
2040142438
Mungkin ada tingkat pencarian lain di luar hash () yang menghindari tabrakan antara kunci kamus. Atau mungkin dict () menggunakan hash yang berbeda.
(Omong-omong, ini dalam Python 2.7.10. Kisah yang sama dalam Python 3.4.3 dan 3.5.0 dengan tabrakan di hash(1.1) == hash(214748749.8)
.)
hash('I wandered lonely as a cloud, that drifts on high o\'er vales and hills, when all at once, I saw a crowd, a host of golden daffodils.')
Ini memberikan desimal 19 digit - -4037225020714749784
jika Anda cukup culun untuk peduli. Lanjutkan dengan kata-kata Anda sendiri, anak-anak, dan hash masih berupa angka 19 digit. Saya berasumsi ada batas pada panjang string yang bisa hash dengan Python, tapi aman untuk mengatakan lebih banyak string yang mungkin daripada nilai yang mungkin. Dan hash(False)
= 0 omong-omong.
Iya. Secara internal ini diimplementasikan sebagai hashing terbuka berdasarkan polinomial primitif atas Z / 2 ( sumber ).
Untuk memperluas penjelasan nosklo:
a = {}
b = ['some', 'list']
a[b] = 'some' # this won't work
a[tuple(b)] = 'some' # this will, same as a['some', 'list']
dict
implementasi Python .