适当减少手机使用,有助于视力保护... 新的一年祝您:身体健康,阖家欢乐!~~

散列、哈希、可变、不可变

浏览量:724 作者:admin 类别:: 学习笔记 更新时间:2022-05-24 18:44:13

>>> 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类型的。


关于博主
北京南城网络及弱电【张工】为您提供:
校园网、楼宇、村镇、园区,光纤网络覆盖,无线覆盖 华为|H3c|锐捷|爱快|panabit等品牌,路由、交换机、AC、AP 无源光网络(PON)设备,布署、调试、维运,等服务...
应急/临时光纤熔接...[藤仓22S]
博文为学习python所写:内容摘自网络、学习笔记、记事备忘。
QQ:872876353,欢迎交流学习、加Q注明来意。

诗文鉴赏

《满江红》· 岳飞
落星侵晓没,
残月半山低。
怒发冲冠,
凭栏处、潇潇雨歇。
抬望眼、仰天长啸,壮怀激烈。
三十功名尘与土,八千里路云和月。
莫等闲、白了少年头,
空悲切。
源于生活-记录日常
The site based on python 3 with flask...