关于TypeError: unhashable type set
python3报错:TypeError: unhashable type set/list/dict
错误原因:在使用hash原理存储的数据结构(比如dict、set等)中使用了不可hash的数据作为关键词,应考虑改变存储数据的方式或存储的数据类型。(详见最后错误示范)
可哈希的元素:int、float、str、tuple、自定义的类的实例对象
不可哈希的元素:list、set、dict
reference:https://segmentfault.com/a/1190000010493234
Hash的更多知识:
An object is hashableif it has a hash value which never changes during its lifetime (it needs a __hash__() method), and can be compared to other objects (it needs an __ eq__() or __cmp__(). Hashable objects which compare equal must have the same hash value.
一个能被称为 hashable 的对象必须有一个唯一对应的 hash 值,这个值在对象的整个生命周期都不会变化,而且必须可以与其它对象(的 hash 值)进行比较(必须实现__hash__() 与 __eq__() 方法)。
Python 的某些链接库在内部需要使用 hash 值,例如往set中添加对象时会用__hash__() 方法来获取hash值,看它是否与集合中现有对象的 hash 值相同,如果相同则会舍去不加入,如果不同,则使用__eq__() 方法比较是否相等,以确定是否需要加入其中。
对于 Python 的内建类型来说,只要是创建之后无法修改的(immutable)类型都是 hashable 如字符串,可变动的都是 unhashable的比如:列表、字典、集合,他们在改变值的同时却没有改变id,无法由地址定位值的唯一性,因而无法哈希。我们自定义的类的实例对象默认也是可哈希的(hashable),而hash值也就是它们的id()。
reference:三十六_ ,https://www.jianshu.com/p/bc5195c8c9cb