Использование идентификатора объекта в качестве хэша для объектов в Python - PullRequest
10 голосов
/ 11 января 2010

Разумно ли использовать объект id в качестве хеш-ключа (через __hash__), чтобы иметь возможность хешировать непостоянный в противном случае объект для одного экземпляра программы? Использование атрибутов объекта было бы лучше, но все они изменчивы и могут меняться.

Это пришло мне в голову, когда я посмотрел на Наборы экземпляров , и мне интересно, мудро ли это.

Ответы [ 2 ]

14 голосов
/ 11 января 2010

Да, если вы также определите __eq__ (и предположительно __ne__! -) в соответствии с этим. Все нормально, пока вы в порядке с a==b, то есть точно таким же, как a is b! -)

6 голосов
/ 11 января 2010

Для большинства классов Python это поведение по умолчанию. Ненасытные не могут быть объяснены по уважительной причине: они являются изменчивыми коллекциями.

Для коллекций целесообразно иметь отношение равенства (как определено __eq__()), основанное на равенстве их содержимого. Это, а также требование, чтобы __hash__() соответствовал равенству, конечно, сделает __hash__() изменчивым, что было бы ужасно для коллекций, содержащих такие объекты.

Таким образом, вы можете сделать это, но это будет стоить вам отношения равенства на основе контента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...