Noufal Ibrahim
Noufal Ibrahim

Reputation: 72745

Using object id as a hash for objects in Python

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

Answers (2)

Rafał Dowgird
Rafał Dowgird

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

Alex Martelli
Alex Martelli

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

Related Questions