tags:

views:

109

answers:

2

Is it wise to use the object id as a hash key (via. the __hash__) to be able to hash an otherwise mutable object for a single instance of a program? Using the object attributes would be nicer but they're all mutable and can change.

This occurred to me while looking at http://stackoverflow.com/questions/2038010/sets-of-instances/2038019 and I'm wondering if it's wise.

+6  A: 

Yes, as long as you also define __eq__ (and presumably __ne__!-) consistently with that. IOW, it's fine, as long as you're fine with a==b meaning exactly the same as a is b!-)

Alex Martelli
Thanks. Your second sentence clarifies it quite well.
Noufal Ibrahim
+2  A: 

For most Python classes this is the default behaviour. The unhashable ones are unhashable for a good reason: they are mutable collections.

For collections it is practical to have the equality relation (as defined by __eq__()) based on equality of their contents. This, and the requirement for __hash__() to be consisent with equality, would of course make the __hash__() mutable, which would be horrible for collections containing such objects.

So you can do this but it costs you the content-based equality relation.

Rafał Dowgird