Bất biến có nghĩa là đối tượng đó sẽ không thay đổi theo bất kỳ cách nào đáng kể trong suốt thời gian tồn tại của nó. Đó là một ý tưởng mơ hồ nhưng phổ biến trong các ngôn ngữ lập trình.
Hashability hơi khác một chút và đề cập đến sự so sánh.
hashable đối tượng An là hashable nếu nó có một giá trị băm mà không bao giờ thay đổi trong suốt cuộc đời của nó (nó cần một__hash__()
phương pháp), và có thể được so sánh với các đối tượng khác (nó cần một__eq__()
hoặc__cmp__()
phương pháp). Các đối tượng có thể băm được so sánh bằng nhau phải có cùng giá trị băm.
Tất cả các lớp do người dùng định nghĩa đều có __hash__
phương thức, theo mặc định chỉ trả về ID đối tượng. Vì vậy, một đối tượng đáp ứng các tiêu chí về khả năng băm không nhất thiết là bất biến.
Các đối tượng của bất kỳ lớp mới nào bạn khai báo đều có thể được sử dụng làm khóa từ điển, trừ khi bạn ngăn chặn nó, chẳng hạn như ném từ __hash__
Chúng ta có thể nói rằng tất cả các đối tượng không thay đổi đều có thể được băm, bởi vì nếu hàm băm thay đổi trong thời gian tồn tại của đối tượng, thì điều đó có nghĩa là đối tượng đó đã bị đột biến.
Nhưng không hoàn toàn. Hãy xem xét một bộ tuple có một danh sách (có thể thay đổi). Một số người nói rằng tuple là bất biến, nhưng đồng thời nó cũng không thể băm (ném).
d = dict()
d[ (0,0) ] = 1
d[ (0,[0]) ] = 1
Tính có thể thay đổi và tính bất biến đề cập đến tính cài đặt đối tượng, không phải kiểu. Ví dụ, một đối tượng kiểu tuple có thể được băm hoặc không.
HashMap
khi một đối tượng bị hỏng nếu bạn sửa đổi một đối tượng được sử dụng làm khóa trong đó: không thể tìm thấy khóa cũ và mới, mặc dù nếu bạn in bản đồ, nó có thể được nhìn thấy ở đó.