Tôi có một lớp (hãy gọi nó là myClass
) thực hiện cả hai __hash__
và __eq__
. Tôi cũng có một số dict
ánh xạ đối tượng myClass
đối với một số giá trị, tính toán mất một thời gian.Điều gì xảy ra khi bạn gọi 'nếu khóa trong dict`
Trong quá trình chương trình của tôi, nhiều (theo thứ tự triệu) myClass
đối tượng được khởi tạo. Đây là lý do tại sao tôi sử dụng dict
để theo dõi các giá trị đó.
Tuy nhiên, đôi khi đối tượng myClass
mới có thể tương đương với đối tượng cũ hơn (như được xác định theo phương pháp __eq__
). Vì vậy, thay vì tính toán giá trị cho đối tượng đó một lần nữa, tôi chỉ muốn tra cứu giá trị của đối tượng cũ hơn myClass
trong dict
. Để thực hiện điều này, tôi làm if myNewMyClassObj in dict
.
Dưới đây là câu hỏi của tôi:
Khi tôi sử dụng mà in
khoản, những gì được gọi là, __hash__
hoặc __eq__
? Điểm sử dụng dict
là thời gian tra cứu O (1). Vì vậy, sau đó __hash__
phải được gọi. Nhưng nếu __hash__
và __eq__
không phải là phương pháp tương đương thì sao? Trong trường hợp đó, tôi có dương tính giả cho if myNewMyClassObj in dict
không?
Theo dõi câu hỏi:
Tôi muốn giảm thiểu số lượng các mục trong dict
của tôi, vì vậy tôi tưởng muốn giữ chỉ là một trong một bộ tương đương myClass
đối tượng trong dict
. Vì vậy, một lần nữa, có vẻ như __eq__
cần phải được gọi khi máy tính if myNewClassObj in dict
, trong đó sẽ làm ô uế một O dict
's (1) tra cứu thời gian để một O (n) tra cứu thời gian
@MartijnPieters: Tôi chỉ vô tình nhấn lưu trước khi đưa họ vào, hiện tại họ đang ở đó. – BrenBarn
Ví dụ tuyệt vời! – inspectorG4dget
Python không sử dụng các nhóm trong bảng băm của nó: nó sử dụng các khe với mỗi khe chứa một giá trị duy nhất. Nếu một khe đã đầy thì nó sẽ chọn một khe khác và cứ như vậy cho đến khi nó tìm thấy một khớp hoặc một khe không sử dụng. – Duncan