>>> from collections.abc import Hashable
>>> mutable = [list, bytearray, set, dict]
>>> immutable = [int, float, complex, str, tuple, frozenset, bytes]
>>> all(isinstance(x(), Hashable) for x in immutable)
True
>>> all(issubclass(x, Hashable) for x in immutable)
True
>>> any(isinstance(x(), Hashable) for x in mutable)
False
>>> any(issubclass(x, Hashable) for x in mutable)
基本类型里,不可变的都是可 hash 的。无论是有序的 Tuple 还是无序的 frozenset,因为其是不可变的,都是可 hash 的。所以都可以当 mapping 的 key。
若是要自定义可 hash 的对象,就一定要实现__hash__、__eq__两个方法。
若是不实现,也可以 hash。这是因为类缺省__hash__、__eq__两个方法,但是其依据是 id 值,那么结果就不是我们想要的。
参考:
https://wiki.python.org/moin/DictionaryKeys#User_Defined_Types_as_Dictionary_Keyshttp://www.laurentluce.com/posts/python-dictionary-implementation/