Computer >> Máy Tính >  >> Lập trình >> Python

Tại sao và làm thế nào các hàm Python có thể được băm?

Một đối tượng được cho là có thể băm nếu nó có giá trị băm không đổi trong suốt thời gian tồn tại của nó. Nó có một phương thức __hash __ () và nó có thể được so sánh với các đối tượng khác. Đối với điều này, nó cần phương thức __eq __ () hoặc __cmp __ (). Nếu các đối tượng có thể băm bằng nhau khi so sánh thì chúng có cùng giá trị băm.

Việc có thể băm hiển thị một đối tượng có thể sử dụng được như một khóa từ điển và một thành viên tập hợp vì các cấu trúc dữ liệu này sử dụng các giá trị băm bên trong.

Tất cả các đối tượng tích hợp sẵn trong python đều có thể băm được. Không thể băm các vùng chứa có thể thay đổi như danh sách và từ điển trong khi có thể băm được bộ lưu trữ có thể thay đổi được

Các đối tượng là thể hiện của các lớp do người dùng định nghĩa có thể được băm theo mặc định; tất cả chúng đều so sánh không bằng nhau (ngoại trừ với chính chúng) và giá trị băm của chúng được lấy từ id () của chúng.

Hàm băm rõ ràng không nhất thiết phải là ID của hàm:Hãy xem xét hàm lambda đã cho.

Ví dụ

m = lambda x: 1
print hash(m)
print id(m)
print m.__hash__()

Đầu ra

1265925722
3074942372
1265925722

Điều này cho thấy rằng các hàm lambda có thể băm được

Ví dụ

Bây giờ chúng ta hãy xem xét hàm f () đã cho như sau

def f():pass
print type(f)
print f.__hash__()
print hash(f)

Đầu ra

<type 'function'>
1265925978
1265925978

Điều này cho thấy rằng bất kỳ hàm nào cũng có thể được băm vì nó có giá trị băm không đổi trong suốt thời gian tồn tại của nó.