Discuss / Python / 对key必须是不可变对象的理解

对key必须是不可变对象的理解

Topic source

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'” 也就是数据类型不满足哈希算法原则。

a_枫临

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

我有个疑惑 a = [1, 2, 5, 2, 6]是一个list吧 那为什么可以 s = set(a)

你说的这个是set的初始化,初始化需要list提供输入集合。

CityeBox

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

这个总结的很好,学习了

王胜辉仔

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

1. 可以对应多个元素的变量都是集合,比如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 #不可变

仔狸

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

学习了


  • 1

Reply