Why and how are Python functions hashable?
So start with the question i.e. Why and how are Python functions hashable? First, one should know what actually hashable means in Python. So, hashable is a feature of Python objects that tells if the object has a hash value or not. If the object has a hash value then it can be used as a key for a dictionary or as an element in a set.
An object is hashable if it has a hash value that does not change during its entire lifetime. Python has a built-in hash method ( __hash__() ) that can be compared to other objects. For comparing it needs __eq__() or __cmp__() method and if the hashable objects are equal then they have the same hash value. All immutable built-in objects in Python are hashable like tuples while the mutable containers like lists and dictionaries are not hashable.
Objects which are instances of the user-defined class are hashable by default, they all compare unequal, and their hash value is their id().
Example: Consider two tuples t1, t2 with the same values, and see the differences:
Python3
t1 = ( 1 , 5 , 6 ) t2 = ( 1 , 5 , 6 ) # show the id of object print ( id (t1)) print ( id (t2)) |
Output:
140040984150664 140040984150880
In the above example, two objects are different as for immutable types the hash value depends on the data stored not on their id.
Example: Let’s see lambda functions are hashable or not.
Python3
# create a one-line function l = lambda x : 1 # show the hash value print ( hash (l)) # show the id value print ( id (l)) # show the hash value print (l.__hash__()) |
Output:
-9223363246992694337 140637793303544 -9223363246992694337
Hence, lambda functions are hashable.
Example: Let’s see user defined def based function are hashable or not.
Python3
# create an empty function def fun(): pass # print types of function print ( type (fun)) # print hash value print (fun.__hash__()) # print hash value print ( hash (fun)) |
Output:
<class 'function'> -9223363242199589441 -9223363242199589441
Therefore, any user defined function is hashable as its hash value remains same during its lifetime.
Please Login to comment...