set:
set 和 dict 类似,也是一组key的集合,但不存储value。由于key不能重复,所以在set中,没有重复的key。
要创建set,需要提供一个list作为输入集合:
注意:传入的参数[1,2,3,4] 是一个list,而显示的 set([1,2,3,4]) 只是告诉你这个set内部有1,2,3,4 这四个元素,显示的 [] 不表示这是一个list。
重复元素在set中自动被过滤:
通过 add(key) 方法可以添加元素到set 中,可以重复添加,但不会有效果:
通过 remove(key) 方法可以删除元素:
set 可以看成数学意义上的无序和无重复的集合,因此,两次 set 可以做数学意义上的交集、并集等操作:
set 和 dict 的唯一区别仅在于没有存储对应的 value,但是 set 的原理和 dict 一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部不会有重复元素。
把 list 放入 set 报错:
再议不可变对象:上面我们讲了,str是不变对象,而list是可变对象。
对于可变对象,比如list,对list进行操作,list内部的内容是会变化的;比如:
对于不可变对象,比如 str 对str 进行操作呢?
虽然字符串有个 replace() 方法,也确实变出了 'Zbc' ,但变量a 最后仍是 'abc' , 应该怎么理解呢?
我们先把代码改成下面这样:
要始终牢记的是,a 是变量,而 'Xbc' 才是字符串对象!有些时候,我们经常说,对象a的内容是 'Xbc' ,但其实是指: a 本身是一个变量,它指向的对象的内容才是 'Xbc' 。
当我们调用 a.replace('a', 'X')时,实际上调用方法 replace 是作用在字符串对象 'Xbc' 上的,而这个方法虽然名字叫replace ,但却没有改变字符串 ‘Xbc’ 的内容。相反,replace 方法创建了一个新的字符串 'Xbc' 并返回,如果我们用变量 b 指向该新字符串,就容易理解了。变量 a 扔指向原有的字符串 'abc' ,但变量 b 却指向新字符串 'Xbc' 了。
所以,对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容,相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。
小结:
使用 key_value 存储结构的 dict 在python中非常有用,选择不可变对象作为 key 很重要。最常用的 key 是字符串。