2010-01-11 39 views
9

Sử dụng đối tượng id làm khóa băm (thông qua. __hash__) để có thể băm một đối tượng có thể thay đổi khác cho một phiên bản chương trình không? Sử dụng các thuộc tính đối tượng sẽ đẹp hơn nhưng tất cả đều có thể thay đổi và có thể thay đổi.Sử dụng id đối tượng làm băm cho các đối tượng trong Python

Điều này xảy ra với tôi khi nhìn vào Sets of instances và tôi tự hỏi nếu nó khôn ngoan.

Trả lời

13

Có, miễn là bạn cũng xác định __eq__ (và có lẽ là __ne__! -) nhất quán với điều đó. IOW, được rồi, miễn là bạn ổn với a==b có nghĩa là chính xác giống như a is b! -)

+1

Cảm ơn. Câu thứ hai của bạn làm rõ nó khá tốt. –

6

Đối với hầu hết các lớp Python, đây là hành vi mặc định. Những thứ không thể sửa chữa là không thể giải quyết được vì một lý do chính đáng: chúng là những bộ sưu tập có thể thay đổi được.

Đối với bộ sưu tập, thực tế phải có mối quan hệ bình đẳng (như được xác định bởi __eq__()) dựa trên sự bình đẳng về nội dung của chúng. Điều này, và yêu cầu đối với __hash__() để được đồng ý với bình đẳng, tất nhiên sẽ làm cho __hash__() có thể thay đổi được, điều này sẽ rất kinh khủng đối với các bộ sưu tập chứa các đối tượng đó.

Vì vậy, bạn có thể thực hiện việc này nhưng chi phí cho bạn là mối quan hệ bình đẳng dựa trên nội dung.

Các vấn đề liên quan