1.dict:
- dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储。
- 正确使用dict非常重要,需要牢记的第一条就是dict的key必须是不可变对象。
- 在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key
- dict={key:value,...}
- key-value存储方式,在存放进去的时候,必须根据key算出value的存放位置,这样,取的时候才能根据key直接拿到value
- 多次对一个key放入value,后面的值会把前面的值覆盖
- 判断dict中是否有key:
- 通过
in
判断key是否存在 - dict提供的
get()
方法,如果key不存在,可以返回None
,或者自己指定的value:dict.get(key,value),返回None
的时候Python的交互环境不显示结果
- 删除一个key:用
pop(key)
方法,对应的value也会从dict中删除 - dict内部存放的顺序和key放入的顺序是没有关系的
- 和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢;
- 需要占用大量的内存,内存浪费多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
2.set:
- set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key
- s=set([1,2,3])
- 要创建一个set,需要提供一个list作为输入集合,重复元素在set中自动被过滤
- 添加元素:set.add(key)
- 删除元素:set.remove(key)
- set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集(&)、并集(|)等操作
3.不可变对象:
- 不可变对象:int,string,float,tuple
- 不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。
- 可变对象 :list,dictionary
- 可变对象,该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变
不可变的对象的特征没有变,依然是不可变对象,变的只是创建了新对象,改变了变量的对象引用。
小结:
关系 | list | tuple |
dict | set |
list | list可以放入list | tuple可以放入list | dict可以放入list | set可以放入list |
tuple | list可以放进tuple | tuple可以放入tuple | dict可以放入tuple | set可以放入tuple |
dict | list可以放入dict作为value,但不可以作为key | tuple可以放入dict作为key | dict可以放入dict作为value,但不可以作为key | set可以放入dict作为value,但不可以作为key |
set | list不可以添入set,但是可以用为输入集合 | tuple可以放入set(只有不含list,tuple,set,dict的tuple可以放进set) | dict不可放入set | set不可以放入set |
既然dict和set原理相同,在Key中均不可以存放不可变对象,那么为什么set中仍然存放的是list?
dict和set中的key确实是不可以用不可变对象。如下:
set中之所以用list可以,是因为它把这个list看做一个整体。list中的元素当然可以替换,但是这并不影响list这个整体。
[这里与tuple可以放入list的原因相同]