Python中的字典和集合
Python标准库中的所有映射类型都是使用dict来实现的,因此他们都有一个共同的限制,即只有可散列的数据类型才可以作为映射的键,那么什么是可散列的数据类型呢?下面介绍下:
在python词汇表中,关于可散列类型的定义有这么一段话:
如果一个对象是可散列的,那么在这个对象的生命周期中,他的可散列值是不变的,而且这个对象需要实现__hash__()方法。另外可散列对象还要有
__eq__()方法,这样才可以和别的键做比较,如果两个可散列对象的值是相等的,那么他们的散列值一定是相等的。
原子不可变数据类型(str,bytes和数值类型)都是可散列类型,frozenset也是可散列的,因为根据其定义,frozonset里只能容纳可散列类型。元组的话,只有当一个元组敖汉的所有元素都是可散列类型的情况下,它才是可散列的。一般来讲,用户自定义的类型都是可散列的,散列值就是他们的id()函数返回值,所以所有这些对象在比较的时候都是不相等的。如果一个对象内部实现了__eq__方法并且在方法内部用到了这个对象的内部状态的话那么只有当所有内部状态都是不可变的情况下,这个对象才是可散列的。
处理找不到的键
当字典d[k]找不到正确的键时,Python会抛出异常,虽然我们可以使用d.get(k,default)来代替d[k],给找不到的键一个默认的返回值,但是在更新时候,效率还是很低的,在这种情况...