Planning a Python Course for Beginners

Marko Rauhamaa marko at pacujo.net
Thu Aug 10 11:37:24 EDT 2017


Python <python at example.invalid>:
> Marko Rauhamaa wrote:
>> Python <python at example.invalid>:
>>>>> Marko Rauhamaa wrote:
>>>> id() is actually an ideal return value of __hash__(). The only criterion
>>>> is that the returned number should be different if the __eq__() is
>>>> False. That is definitely true for id().
>>>>>> $ python
>>> Python 2.7.13 (default, Jan 19 2017, 14:48:08)
>>> [GCC 6.3.0 20170118] on linux2
>>> Type "help", "copyright", "credits" or "license" for more information.
>>>>>> nan = float('NaN')
>>>>>> id(nan) == id(nan)
>>> True
>>>>>> nan == nan
>>> False
>>>>>>>>>> Point being?
>> It is a counter example to your claim that if __eq__(...) is false
> then id should return different values.

No it's not:
 * __hash__() *should* return different values. It is neither possible
 nor necessary in the general case.
 * For NaN, there's no better alternative.
 * Dictionaries and sets try "is" before __eq__(...) so everything works
 anyway.
So, to be precise, the __hash__() rule is:
 a.__hash__() *should* return a different number than b.__hash__() if
 a is not b and not a.__eq__(b)
 a.__hash__() *must* return the same number as b.__hash__() if
 a is b or a.__eq__(b)
Marko


More information about the Python-list mailing list

AltStyle によって変換されたページ (->オリジナル) /