2008-12-08 22 views
6

mã đơn giản:Chức năng nào được sử dụng để kiểm tra xem hai đối tượng có khác nhau không?

>>> set([2,2,1,2,2,2,3,3,5,1]) 
set([1, 2, 3, 5]) 

Ok, trong các bộ kết quả không có bản sao. Điều gì xảy ra nếu đối tượng trong danh sách không phải là int nhưng một số được xác định bởi tôi? Phương pháp nào kiểm tra xem chúng có khác nhau không? Tôi đã triển khai __eq__ và __cmp__ với một số đối tượng nhưng đặt dường như không sử dụng chúng: \

Có ai biết cách giải quyết vấn đề này không?

Trả lời

13

Theo số set documentation, các thành phần phải là hashable.

Đối tượng có thể băm nếu giá trị băm không bao giờ thay đổi trong suốt thời gian tồn tại (cần có phương pháp __hash__()) và có thể được so sánh với các đối tượng khác (cần phương pháp __eq__() hoặc __cmp__()). 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.

EDIT: thêm nét Hashable thích nhờ Roberto

+0

"khi và chỉ khi" chẳng có ý nghĩa, mặc dù. Hàm băm có thể được sử dụng để chọn trước các mục bằng nhau, nhưng chắc chắn so sánh trực tiếp các giá trị thực tế cũng phải xảy ra, hoặc kết quả của các so sánh được đặt sẽ là ngẫu nhiên. –

+0

Từ tài liệu python: Một đối tượng có thể băm nếu giá trị băm không bao giờ thay đổi trong suốt vòng đời của nó (nó cần phương thức __hash __()) và có thể so sánh với các đối tượng khác (cần __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. –

+0

được chỉnh sửa trong phản hồi của roberto. – TheSoftwareJedi

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