>>> s3 = {"facebook", [1,2,'a'], {"name":"python", "lang":"english"}, 123}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> s3 = {"facebook", [1,2], 123}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
通过{}无法创建含有列表或者字典类型对象
元素的集合。
认真阅读报错信息,有这样的词汇:“unhashable”,在理解这个词
之前,先看它的反义词“hashable”,很多时候翻译为“可哈希”,其实它
有一个不是音译的名词“散列”。如果我们简单点理解,某数据“不可哈
希”(unhashable)就是其可变,如列表和字典都能原地修改,就是
unhashable。否则,不可变的,类似字符串那样不能原地修改的就是
hashable(可哈希)。
对于字典类型的对象,其“键”必须是hashable,即不可变。
现在遇到的集合,其元素也是“可哈希”的。上面的例子,试图将字
典、列表作为元素的元素,就报错了。而且报错信息中明确告知列表和
字典是不可哈希类型,言外之意,里面的元素都应该是可哈希类型。
继续探索另外一种情况:
>>> s1
set(['q', 'i', 's', 'r', 'w'])
>>> s1[1] = "I"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'set' object does not support item assignment
这里报错,进一步说明集合不是序列类型,不能用索引方式对其进
行修改。
根据前面的经验,类型名称函数能够实现类型转换,比如str()就是
将对象转化为字符串,同理,分别用list()和set()能够实现集合和列表两种对象之间的转化。
>>> s1
set(['q', 'i', 's', 'r', 'w'])
>>> lst = list(s1)
>>> lst
['q', 'i', 's', 'r', 'w']
>>> lst[1] = "I"
>>> lst
['q', 'I', 's', 'r', 'w']
特别说明,利用set()建立起来的集合是可变集合,可变集合都是
unhashable类型的。