Discuss / Python / 抱歉,上一个发错了

抱歉,上一个发错了

Topic source

汐汐异星

#1 Created at ... [Delete] [Delete and Lock User]

有两点疑问

1.刚开始用set时,教程里说是要创建一个set,需要提供一个list作为输入集合:

>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}

最后又说set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错。

这不是互相矛盾吗?

2.为什么s = set([1,2,3])不报错,而s = set((1,[2,3])报错,明明都是变化的

楼下的相同问题的解答我是属实没看懂,有搞明白的老哥可以给解释一下吗,感激不尽!!

你可以将s = set([1, 2, 3]) 中的 [1,2,3] 理解为set这个类型对其包含的数据的一个形式上的要求,这里并不是list作为set的key,而是list中的元素作为了set的key。

换句话说,无论你准备把任何东西装入set,它都必须先是一个list(或者tuple)的形式,甚至是空集,也得是 [ ] 。

再来看第二个,s = set((1,[2,3]))的中,先进行赋值

 list1 = [2,3]

则,这时候的s变换为 

s = set((1, list1))

看到这里你明白了吗?这是在想将一个tuple = (1, list1) 装入s这个set。这个tuple中有两个元素,一个是1,一个是list1,因为list1可变(不可hash),所以不能存入s这个set中,也就会报错了。

汐汐异星

#3 Created at ... [Delete] [Delete and Lock User]

明白了,非常感谢!

ByteDanceUs

#4 Created at ... [Delete] [Delete and Lock User]

解释的非常棒!!!

那本质是不是因为可变list无法进行hash运算,得不到hash值?

可以hash,但是因为这个是可变的,所以hash值不固定,不是举了字典的例子,不管是首字母还是偏旁,这个都是固定的,不知道这样能不能理解

G梅果果

#7 Created at ... [Delete] [Delete and Lock User]

用一个 list 来初始化 set,感觉就像是把这个 list 每个元素都扒开了往 set 里填,所以第一个全部数据就 1,2,3

但是第二个全扒开以后,元素 为 1,[2,3],第二个元素不符合 set 的特性,所以会初始化失败

赞一个

有为若是

#9 Created at ... [Delete] [Delete and Lock User]

2楼的解释说得很清楚,解释真好。list里的每一个元素变成了set里的每一个键(名)了。


  • 1

Reply