Reputation: 72745
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 Sets of instances and I'm wondering if it's wise.
Upvotes: 11
Views: 2609
Reputation: 45081
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.
Upvotes: 7
Reputation: 881575
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
!-)
Upvotes: 14