Почему итераторы и генераторы являются хэшируемыми? - PullRequest
3 голосов
/ 23 октября 2019

как заголовок. Я имею в виду, вы можете вызвать next(obj) и указать на следующий элемент. Таким образом, внутреннее состояние итерируемого или генератора изменится.

Почему они являются хэшируемыми?

Ответы [ 2 ]

2 голосов
/ 23 октября 2019

Общее правило для объектов хеширования:

  1. Если __eq__ не переопределено, равенство объектов определяется идентичностью, и совпадения хеширования
  2. Если __eq__ переопределено,и __hash__ - нет, тогда хеширование по умолчанию блокируется (поскольку изменчивость , которая влияет на результат проверки на равенство , нарушит хеш-инварианты);для повторного включения хеширования требуется реализация __hash__, которая неявно говорит «Моя семантика равенства и хеша стабильна / непротиворечива во времени», но не требует, чтобы вещи, не связанные с равенством или хеш-кодом, были стабильными.

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

1 голос
/ 23 октября 2019

Хотя внутреннее состояние генератора может изменяться, генератор в целом никогда не сможет добавить что-то к себе и никогда не сможет вернуться на шаг назад, перебирая его. Следовательно, генератор - это фиксированный неизменяемый объект, который является почти определением возможности хэширования.

Но даже глубже, даже изменяемые объекты могут быть хэшируемыми, если они определяют __hash__ как метод экземпляра. , но это редко желательно для изменяемых объектов.

...