前面字典 dict 实现 switch 这样的功能,但是没有深入介绍 dict 这个数据类型,这里开始补充下。
字典 dict,是 Python 唯一的标准 mapping 类型,也是内置在 Python 解释器中的。mapping object 把一个可哈希的值(hashable value)映射到一个任意的 object 上。
什么是可哈希(hashable)的?一个 object 是可哈希的(hashable),是指这个 object 在其生存期内有一个不变的哈希值(hash value),即__hash__() 方法返回的值。
所有不可变的(immutable)内置 object 都是 hashable 的,比如 string,tuple。所有可变的(mutable)内置容器都不是 hashable 的,比如 list,dict(即没有 __hash__() 方法)。而所有自定义的类(use-defined class)对象都是可哈希的(hashable),并且只能和自己相等,其 hashvalue 为其 id(object) 的值,这里的 id() 为内置函数,CPython 实现的时候取的对象在内存中的地址。
字典 Dictionary 的 key 必须是可哈希的,所以 tuple(元组),string 可以做 key,而 list 不能做 key,关于后面会解释。
字典的创建
dict 本身是一个类,可以通过 dict 类来构建字典:
>>> d = dict({1:'a', 2:'b', 3:'c'})
>>> d
{1: 'a', 2: 'b', 3: 'c'}
>>> d2 = {1:'a', 2:'b', 3:'c'}
>>> d2
{1: 'a', 2: 'b', 3: 'c'}
>>>
那么字典这个数据类型有什么好处呢?它提供了很多方便的操作:
dictionary支持的操作
1. 引用元素
直接用d[key],就可以得到key所对应得那个object:
>>> d2 = {1:'a', 2:'b', 3:'c'}
>>> d2
{1: 'a', 2: 'b', 3: 'c'}
>>> d2[1]
'a'
但是如果key不存在呢,如果使用的就是标准的dict,那么会抛出KeyError异常。但是如果我们是自己从dict派生了一个自己的dictionary,那么只要我们定义__missing__函数,当key不存在时,这个函数会以key做为参数被调用,我们试验一下。
写一个module,mdict.py:
class myDict(dict):
def __missing__(self, key):
print "__missing__ called , key = ", key
return "nowamagic.net"
然后打开Python命令行解释器,import mdict
>>> from mdict import myDict
>>> d = myDict({1:'a', 2:'b', 3:'c'})
>>> d
{1: 'a', 2: 'b', 3: 'c'}
>>> d[1]
'a'
>>> d[4]
__missing__ called , key = 4
nowamagic.net
可以看到__missing__()被调用了。
如果只想得到某个key对应的value,不想对其进行改变,则用类方法get() ,这类似C++中“引用”和“值”的概念。
>>> a = d.get(1)
>>> a
'a'
2. 类方法实现的操作
>>>d.clear()# 清空
>>>d.copy() # 拷贝生成另一个,浅拷贝(shallow copy)
d.keys(),d.values(),d.items() 这三个都会生成dictionary相应的keys,values,items的copy,返回结果都是list,d.items()生成的是(key,value)二元tuple的list。
>>> d.items()
[(1, 'a'), (2, 'b'), (3, 'c')]
>>> d.keys()
[1, 2, 3]
>>> d.values()
['a', 'b', 'c']
d.viewkeys(),d.viewvalues(),d.viewitems()
这三个都会生成dictionary相应的view object,view object是dictionary中(key,value)的动态反映,当dictionary中的内容变化时,view object也会变。
>>> viewkeys = d.viewkeys()
>>> viewkeys
dict_keys([1, 2, 3])
>>> list(viewkeys)
[1, 2, 3]
>>> del d[1]
>>> list(viewkeys)
[2, 3]
3. 内置函数实现的操作
>>>len(d) #dictionary的长度
>>>del d[key] 或 del d #del语句
>>>key in d 或 key not in d #返回True or False
因为操作的便利,Dict 类型在 Python 应用很广泛。