Một trong những cấu trúc dữ liệu cơ bản trong Python là từ điển, cho phép một người ghi lại các "khóa" để tìm kiếm "giá trị" của bất kỳ loại nào. Điều này được thực hiện trong nội bộ như một bảng băm? Nếu không, nó là gì?
Một trong những cấu trúc dữ liệu cơ bản trong Python là từ điển, cho phép một người ghi lại các "khóa" để tìm kiếm "giá trị" của bất kỳ loại nào. Điều này được thực hiện trong nội bộ như một bảng băm? Nếu không, nó là gì?
Câu trả lời:
Vâng, nó là một ánh xạ băm hoặc bảng băm. Bạn có thể đọc một mô tả về việc thực hiện chính tả của python, như được viết bởi Tim Peters, tại đây .
Đó là lý do tại sao bạn không thể sử dụng thứ gì đó 'không thể băm' làm khóa chính tả, như danh sách:
>>> 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
Bạn có thể đọc thêm về bảng băm hoặc kiểm tra xem nó đã được thực hiện như thế nào trong python và tại sao nó được thực hiện theo cách đó .
.keys()
có thể lấy một danh sách các khóa. Một bảng băm thực sự sẽ không lưu trữ khóa, chỉ cần băm để tiết kiệm không gian.
Phải có nhiều từ điển Python hơn là tra cứu bảng trên hàm băm (). Bằng thử nghiệm vũ phu tôi đã tìm thấy sự va chạm băm này :
>>> hash(1.1)
2040142438
>>> hash(4504.1)
2040142438
Tuy nhiên, nó không phá vỡ từ điển:
>>> d = { 1.1: 'a', 4504.1: 'b' }
>>> d[1.1]
'a'
>>> d[4504.1]
'b'
Kiểm tra sự tỉnh táo:
>>> for k,v in d.items(): print(hash(k))
2040142438
2040142438
Có thể có một mức tra cứu khác ngoài hàm băm () để tránh va chạm giữa các khóa từ điển. Hoặc có thể dict () sử dụng hàm băm khác.
(Nhân tiện, điều này trong Python 2.7.10. Câu chuyện tương tự trong Python 3.4.3 và 3.5.0 với sự va chạm tại 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.')
Điều này cho số thập phân 19 chữ số - -4037225020714749784
nếu bạn đủ táo bạo để quan tâm. Tiếp tục bằng từ của riêng bạn, trẻ em và hàm băm vẫn là một số có 19 chữ số. Tôi giả sử có giới hạn về độ dài của chuỗi bạn có thể băm trong Python, nhưng an toàn để nói nhiều chuỗi có thể hơn các giá trị có thể. Và hash(False)
= 0 bằng cách này.
Đúng. Trong nội bộ, nó được thực hiện dưới dạng băm mở dựa trên đa thức nguyên thủy trên Z / 2 ( nguồn ).
Để mở rộng theo lời giải thích của nosklo:
a = {}
b = ['some', 'list']
a[b] = 'some' # this won't work
a[tuple(b)] = 'some' # this will, same as a['some', 'list']
dict
triển khai của Python .