廖雪峰的官方网站
Blog
Java教程
手写Spring
手写Tomcat
Makefile教程
Python教程
JavaScript教程
区块链教程
SQL教程
Git教程
文章
问答
More
Java教程
手写Spring
手写Tomcat
Makefile教程
Python教程
JavaScript教程
区块链教程
SQL教程
Git教程
文章
问答
Java教程
手写Spring
手写Tomcat
Makefile教程
Python教程
JavaScript教程
区块链教程
SQL教程
Git教程
文章
问答
Profile
Passkey
Sign Out
Sign In
English
简体中文
Discuss
/
Python
/ 不知道这样理解对不对
Back
不知道这样理解对不对
Topic source
哎呀博雅
#1 Created at
...
[
Delete
] [
Delete and Lock User
]
那么把(1, 2, 3)和(1, [2, 3])分别放入dict或set中,可以看到
dict d={(1,2,3)}
>>>d
{(1,2,3)}
len(d) >>>1
正常运行,但是可以看出,原本可以增删改查的dict不能对内部对象进行修改了,原因就是,dict内部指向的对象是一个不可变的tuple。
dict d={(1, [2, 3])}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
// 提示无法使用类型,改下代码
d={(1, [2, 3]}
//给内部括号去掉变成不是tuple
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
//还是不行
按照提示,“类型错误,不能使用不可哈希的类型list”说人话就是你这个类型的代码不能这么用,因为里面有个对象list可以改变,我是一个从开始定义就不能改变的代码,给你报个错。//unhashable的意思是不可哈希,就是指其可变,如列表,字典等,都是能原地进行修改的。hashable的意思是可哈希,就是不可变,如字符串、元组(tuple)那样,不能原地修改
可以看出dict内对象除了可哈希类型,其他都不行
set b = set((1, 2, 3))
>>>b
{1, 2, 3}
//执行下添加命令
>>> b.add(4)
>>> b
{1,2,3,4}
//添加对象成功
发生了什么,不是说tuple元组是不可变的吗~~为什么还出现了可以添加对象到tuple元组的情况?
//执行删除
b.remove(4)
>>> b
{1,2,3}
//也可以使用
//换另一个代码
b = set((1, [2, 3]))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
//提示不可哈希,类型错误:list
不可变的类型tuple变化了,可变的list报错了,为什么呢,原因是set不存储value所以需要一个list或者tuple来作为输入集合,可以理解为set这个类型对其包含的数据的一个
形式上的要求
(可以理解必须这么写,不这么写头打歪),这里并不是list作为set的key,而是list中的元素作为set的key。
换句话说,无论准备将任何元素装入set,它都必须先是一个list或tuple的形式,甚至是空集也得是一个 [] 或()
之所以set([1,2,3])和set((1,2,3))通过,是因为,set()传递了一个可迭代的对象,然后set()返回了一个集合{1,2,3},但set中出现了一个可变对象list【b = set((1, [2, 3]))】[2,3],list属于可变对象,所以不成功。
同理 set{[1,2,3]}和 set{(1,2,3)}都是可变对象,所以不符合可哈希原则,那就无法被执行
可变对象包括
字典 {dict}
集合 sets()
列表 [list]
不可变对象包括
整型 int(1 ,2, 3, 4)
字符串 string('你好')
浮点型 float(3.1415926)
元组 s=(1,2,3.14159,'你好')
1
Reply
Sign in to make a reply
哎呀博雅
那么把(1, 2, 3)和(1, [2, 3])分别放入dict或set中,可以看到