On my machine, hash(None)
returns a value:
>>> hash(None)
-2138947203
Just out of curiosity, how is this hash value c
It is based on None's id
, but None is one of a few Python objects that are defined as C global variables, so its address (typically) doesn't change between Python runs. Other such objects are True
and False
(but these are hashed as ints), or built-in classes like object
and tuple
.
The address (and hash) is different between different CPython builds, however. On my system, hash(None)
gives 539708.
As None
is an object, I've wrote a function object_hash
for calculation of object hash:
import sys
import struct
def int_overflow(value):
""" simulate integer overflow """
m = sys.maxint + 1
return (value + m) % (m * 2) - m
def object_hash(value):
res = id(value)
sizeof_void_p = struct.calcsize('P')
res = int_overflow((res >> 4) | (res << (8 * sizeof_void_p - 4)))
if res == -1:
res = -2
return res
The resulting hashes are equal:
>>> hash(None)
492116
>>> object_hash(None)
492116L
It's based on the address of None in memory, as the type definition says.