2008-12-08 2 views
6

Простой код:Что функция использует, чтобы проверить, отличаются ли два объекта?

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

Ok, в результате множества нет дубликатов. Что делать, если объект в списке не является int, но некоторые из них определены мной? Какой метод он проверяет, чтобы понять, отличаются ли они? Я реализовал __eq__ и __cmp__ с некоторыми объектами, но набор, похоже, их не использует: \

Кто-нибудь знает, как это решить?

ответ

13

Согласно set documentation, элементы должны быть hashable.

Объект является hashable, если он имеет значение хеш-функции, которые никогда не изменяется в течение его срока службы (ей необходим метод __hash__()), и может быть по сравнению с другими объектами (он нуждается в __eq__() или __cmp__() метод). Объекты Hashable, которые сравнивают одинаковые, должны иметь одно и то же значение хэш-функции.

EDIT: добавлены соответствующие Hashable определения благодаря Роберто

+0

«тогда и только тогда, когда» не имеет смысла, хотя. Хеш может использоваться для предварительного выбора равных элементов, но, конечно же, должно происходить прямое сравнение фактических значений, или результаты выборочных сравнений были бы довольно случайными. – 2008-12-08 23:11:31