阅读文档
object.__hash__(self)
由内置函数
hash()
调用,以及对散列集合成员的操作,包括set,frozenset和 dict 。 [...]
和....
所有Python的不可变内置对象都是可清除的,而没有可变容器(例如列表或词典)。
来自控制台:
>>> a = {'name': 'abcdef'}
>>> hash(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
据我所知,dict对象不可清除,为什么文档说我可以在dict对象上调用hash函数?
答案 0 :(得分:3)
由内置函数hash()调用,并对散列集合的成员进行操作,包括set,frozenset和dict。 [...]
__hash__
在集合成员(或键)上调用,而不是在集合本身上调用。
答案 1 :(得分:2)
您误读了文档。
object.__hash__
[c]由内置函数hash()
和成员散列集合(包括set,frozenset和dict)进行操作。< / em>的
__hash__
上 dict
未。它在dict
的成员上调用。
演示:
>>> class Hashable(object):
... def __hash__(self):
... print '__hash__ was called'
... return super(Hashable, self).__hash__()
...
>>> {Hashable(): None}
__hash__ was called
{<__main__.Hashable object at 0x10bce7750>: None}
因为Hashable()
实例被用作键,所以在创建字典时会调用其__hash__
方法。