Ethan Furman wrote: > Peter Otten wrote: >> Ethan Furman wrote: >> >>> Several folk have said that objects that compare equal must hash equal, >>> and the docs also state this >>> http://docs.python.org/dev/reference/datamodel.html#object.__hash__ >>> >>> I'm hoping somebody can tell me what horrible thing will happen if this >>> isn't the case? Here's a toy example of a class I'm thinking of writing >>> that will compare equal with int's, but hash differently: >>> >>> --> class Wierd(): >>> ... def __init__(self, value): >>> ... self.value = value >>> ... def __eq__(self, other): >>> ... return self.value == other >>> ... def __hash__(self): >>> ... return hash((self.value + 13) ** 3) >>> ... >> >> Try this: >> >>>>> d = {Wierd(1): 0} >>>>> 1 in d >> False >>>>> 1 in d.keys() >> True >> > > My apologies -- I'm trying this in Python3:
Then you have to convert the keys to a list explicitly: >>> class Weird: ... def __init__(self, value): ... self.value = value ... def __eq__(self, other): ... return self.value == other ... def __hash__(self): ... return hash((self.value + 13) **3) ... >>> d = {Weird(1): 0} >>> 1 in d False >>> 1 in d.keys() False >>> 1 in list(d.keys()) True -- http://mail.python.org/mailman/listinfo/python-list