Mam klasę (nazwijmy ją myClass
), która implementuje zarówno __hash__
, jak i __eq__
. Mam także dict
, który odwzorowuje obiekty o wartościach, które wymagają trochę czasu.Co się dzieje, gdy wywołasz `if key in dyict`
W trakcie trwania mojego programu tworzy się wiele obiektów (rzędu milionów) myClass
. Dlatego używam dict
do śledzenia tych wartości.
Jednak czasami nowy obiekt myClass
może być równoważny ze starszym (zgodnie z metodą __eq__
). Więc zamiast obliczać wartość dla tego obiektu, wolę po prostu sprawdzić wartość starszego obiektu myClass
w dict
. Aby to osiągnąć, wykonuję if myNewMyClassObj in dict
.
Oto moje pytanie:
Kiedy używam tego in
klauzuli, co jest wywoływana, __hash__
lub __eq__
? Punktem użycia dict
jest to, że jest to czas wyszukiwania O (1). Tak więc musi zostać wywołany __hash__
. Ale co, jeśli __hash__
i __eq__
nie są równorzędne metody? W takim przypadku, czy otrzymam fałszywy alarm za if myNewMyClassObj in dict
?
Kontynuacja pytanie:
Chcę, aby zminimalizować liczbę wpisów w moim dict
, więc chciałbym idealnie chce zachować tylko jeden zestaw równoważnych myClass
obiektów w dict
. Ponownie więc, wydaje się, że __eq__
musi być wywoływana podczas obliczania if myNewClassObj in dict
, co kala O dict
„S (1) Czas wyszukiwania do O (N) Czas wyszukiwania
@MartijnPieters: Po prostu losowo zapisałem, zanim je uwzględniłem, są tam teraz. – BrenBarn
Fantastyczne przykłady! – inspectorG4dget
Python nie używa segmentów w tabelach mieszania: używa szczelin w każdym gnieździe zawierającym pojedynczą wartość. Jeśli slot jest pełny, wybiera inny slot i tak dalej, aż znajdzie pasujący lub nieużywany slot. – Duncan