Unexpected behavior with dictionary keys containment and a user-defined class
jstroud at mbi.ucla.edu
Tue Jan 13 04:56:19 CET 2009
Rob Clewley wrote:
> Hi, the short version of my question is: when is a dictionary's
> __contains__ method behavior different to using the 'in' idiom?
> (because I have an example of a difference in my code).
> Longer version: I have a user-defined class with a few overrides of
> special methods, particularly __eq__ and __ne__. I also have a
> dictionary keyed by instances of these classes, and I'm confused about
> the unexpected behavior trying to test whether an instance is in the
> dictionary's keys. The instance is i and the dictionary is d. I have
> been using the idiom
> i in d
> which I understood to be the pythonic way to test the keys, but it
> doesn't work. However, when I debug my code I see the instance in the
> list of keys, and in fact
> i in d.keys() and d.keys() == i
> both return True. But
> d.keys() is i
> return False. I put a print statement in my class's __eq__ method and
> it is being called. It tests equality of some of my class instance's
> attributes. I didn't realize there was any situation where you could
> expect different results from i in d versus i in d.keys() --
> am I misunderstanding something?
Well, the only conclusion is that dict uses the hash of an object to
test containment while lists use id.
More information about the Python-list