对key必须是不可变对象的理解
Topic source1. 可以对应多个元素的变量都是集合,比如list, tuple, set, dict。其中前三者的数据结构相似,之间是可以互相转换的(直接使用list,tuple,set函数命令)。而dict由于是键值对的形式,不能与前三者直接转换。
2. 非键值对的数据形式,即除dict外的其它数据类型,都不可以直接转化成dict,必须用某种方式来声明键值对是如何配对的才可以。
3. dict类型和set类型都可以用花括号来创建。{1,2,3}创建的就是set类型,{1:1, 2:2}创建的就是dict类型。
4. 创建set类型有两种方法:一种是用set函数,另一种是用花括号。但是两者有区别,
对于第一种方法,如果对单个元素使用set命令,则须保证此元素为不可变类型,如对a = '123',可直接执行set(a)返回set类型,如果对集合元素使用set命令,则无需保证集合是否可变,只需保证集合中的每个元素不可变,如对list1 = [1,2,3],虽然list1是列表,是可变类型,但其中的每个元素都是不可变类型,因此也可以直接执行set(list1)返回set类型;
对于第二种方法,则需要保证花括号中的元素为不可变类型。此时,对比在上一方法中直接可行的set(list1),直接执行{list1}就不可行了,会报错TypeError: unhashable type。
同时值得注意的是,对于第二种方法,虽然tuple是不可变类型,但当tuple中包含可变类型的数据时,依然会报错。所以更恰当的说法是,对于第二种说法,需要保证对花括号中的元素执行print命令,返回的值没有可能变化,才行。
list1 = [1,2,3] #可变
tuple1 = (1,2,3) #不可变
set1 = {1,2,3} #可变
str1 = '123' #不可变
int1 = 123 #不可变
- 1
Vincent_胡小金
tuple1=(1,2,3) tuple2=(1,[2,3]) tuple()虽然说是不可变序列,但是tuple1与tuple2是有区别的。像之前课程讲list与tuple的差别时,tuple1是典型的tuple数据类型,里面的元素都是不可变的,符合哈希算法原则,所以既可以放入dict中,也可以放在set中;而tuple2的元素中含有list数据类型,list是可变的,tuple2中的list元素改变必然导致其不符合哈希算法原则,也就不能放入dict以及set中。总之一句话,只要含有list这样可变的数据类型都不能放入dict以及set中,不知道我这样理解正不正确。具体的示例如下: (1)tuple1可以放入dict以及set中: dict1={tuple1} dict1 {(1,2,3)} set1=set([tuple1]) set1 {(1,2,3)}
(2)tuple2不能放入dict以及set中: {tuple2}与([tuple2])的输出结果都是显示: “TypeError: unhashable type: 'list'” 也就是数据类型不满足哈希算法原则。