Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

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

Đối tượng hashable có giá trị hash không đổi suốt vòng đời, có phương thức __hash__() và có thể so sánh (__eq__()). Hashable objects có thể làm key của dict hoặc phần tử của set.

Đặc điểm

  • Tất cả built-in immutable objects đều hashable: int, str, tuple, frozenset...
  • Mutable containers (list, dict, set) không hashable.
  • Instance của user-defined class: hashable mặc định (hash từ id(), so sánh bằng identity).
  • Function objects cũng hashable (vì immutable sau khi tạo).

Ví dụ kiểm tra hash

m = lambda x: 1
print(hash(m))      # 1265925722
print(id(m))        # 3074942372 (khác hash)
print(m.__hash__()) # 1265925722

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

Giải thích

  • Hash của function không nhất thiết bằng id() (xem ví dụ lambda).
  • Hash được tính từ identity của function object, không đổi trong vòng đời.
  • Hai function khác nhau (da khác code) có hash khác nhau.
  • Cho phép dùng function làm key dict: {my_func: "metadata"}.