tuple和set

最后更新于:2022-04-02 00:35:11

### tuple(元组) 另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改,tuple属于不可变对象。比如同样是列出同学的名字: ~~~ >>> classmates = ('Michael', 'Bob', 'Tracy') ~~~ 现在,classmates这个tuple不能变了,它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用`classmates[0]`,`classmates[-1]`,但不能赋值成另外的元素。 不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。 **只有1个元素的tuple定义时必须加一个逗号**,**,以消除与数学表达式的歧义。 ~~~ >>> t = (1,)#not (1) >>> t (1,) ~~~ **最后来看一个“可变的”tuple:** ~~~ >>> t = ('a', 'b', ['A', 'B']) >>> t[2][0] = 'X' >>> t[2][1] = 'Y' >>> t ('a', 'b', ['X', 'Y']) ~~~ 这个tuple定义的时候有3个元素,分别是`'a'`,`'b'`和一个list。不是说tuple一旦定义后就不可变了吗?怎么后来又变了? 别急,我们先看看定义的时候tuple包含的3个元素:                     当我们把list的元素`'A'`和`'B'`修改为`'X'`和`'Y'`后,tuple变为: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/144f9f0de687d8d587e9bf97da0d0a37_281x238.jpg)                          ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/a75f71fcd0a831baecac1249d327fb43_280x228.jpg) 表面上看,tuple的元素确实变了,但其实变的不是tuple的元素,而是list的元素。tuple一开始指向的list并没有改成别的list,所以,**tuple所谓的“不变”是说,tuple的每个元素,指向永远不变。**即指向`'a'`,就不能改成指向`'b'`,指向一个list,就不能改成指向其他对象,但指向的这个list本身是可变的! 理解了“指向不变”后,要创建一个内容也不变的tuple怎么做?那就必须保证tuple的每一个元素本身也不能变。 ### set(集合) set可以看成数学意义上的无序和无重复元素的集合。 ~~~ >>> s = set([1, 1, 2, 2, 3, 3]) >>> s set([1, 2, 3]) ~~~ set操作结合: 通过`add(key)`方法可以添加元素到set中,可以重复添加,但不会有效果: ~~~ >>> s.add(4) >>> s set([1, 2, 3, 4]) >>> s.add(4) >>> s set([1, 2, 3, 4]) ~~~ 通过`remove(key)`方法可以删除元素: ~~~ >>> s.remove(4) >>> s set([1, 2, 3]) ~~~ 两个set可以做数学意义上的交集、并集等操作: ~~~ >>> s1 = set([1, 2, 3]) >>> s2 = set([2, 3, 4]) >>> s1 & s2 set([2, 3]) >>> s1 | s2 set([1, 2, 3, 4]) ~~~ **set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象**,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错。
';