字典dict,是Python惟一的標準mapping類型,也是內置在Python解釋器中的。python
mapping object把一個可哈希的值(hashable value)映射到一個任意的object上。app
什麼是可哈希的函數
一個object是可哈希的(hashable), 是指這個object在其生存期內有一個不變的哈希值(hash value),即__hash__()方法返回的值。ui
全部不可變的(immutable)內置object都是hashable的,好比string,tuple。全部可變的(mutable)內置容器都不是hashable的,好比list,dict(即沒有__hash__()方法)。而全部自定義的類(use-defined class)對象都是可哈希的(hashable),而且只能和本身相等,其hashvalue爲其id(object)的值,這裏的id()爲內置函數,CPython實現的時候取的對象在內存中的地址。spa
字典Dictionary的key必須是可哈希的,因此tuple,string能夠作key,而list不能作key,關於這個我之後會專門解釋,或參見文末參考第3篇。命令行
dict自己是一個類code
class dict(mapping)對象
1,字典的建立blog
1
2
3
4
5
6
|
>>> d
=
dict
({
1
:
'a'
,
2
:
'b'
,
3
:
'c'
})
#經過dict類來構建
>>> d
{
1
:
'a'
,
2
:
'b'
,
3
:
'c'
}
>>> d2
=
{
1
:
'a'
,
2
:
'b'
,
3
:
'c'
} #直接構建,注意語法,大括號,冒號,逗號
>>> d2
{
1
:
'a'
,
2
:
'b'
,
3
:
'c'
}
|
2,dictionary支持的操做內存
做爲Python惟一的標準mapping type,dictionary支持了增,刪,查,總體更新等操做。
一部分操做是由dict的成員函數實現的,一部分操做是由Python的內置函數(built-in)function實現的,也有使用Python的del語句
2.1 引用元素
直接用d[key],就能夠獲得key所對應得那個object,可是若是key不存在呢,若是使用的就是標準的dict,那麼會拋出KeyError異常。可是若是咱們是本身從dict派生了一個本身的dictionary,那麼只要咱們定義__missing__函數,當key不存在時,這個函數會以key作爲參數被調用,咱們試驗一下。
寫一個module ,mdict.py
1 class myDict(dict): 2 def __missing__(self, key): 3 print "__missing__ called , key = ", key
4 return "^_^"
而後打開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
^_^
能夠看到__missing__()被調用了。
若是隻想獲得某個key對應的value,不想對其進行改變,則用對象方法get() ,這相似C++中「引用」和「值」的概念。
>>> a = d.get(1) >>> a 'a'
2.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]
2.3 內置函數實現的操做
>>>len(d) #dictionary的長度
>>>del d[key] 或 del d #del語句
>>>key in d 或 key not in d #返回True or False
3, 字典的bool判斷
Python的對象均可以直接用來判斷其bool值,對內置的字典來講,當其爲空時爲False,不爲空時True
>>> d = {} >>> bool(d) False