前面我們了解了列表list和元組tuple兩個(gè)序列,是存儲(chǔ)不同類型數(shù)據(jù)的容器。
對(duì)列表和元組不清楚的朋友可以了解下這兩篇文章:
今天我們了解下另外一種容器類型:字典dict,它可以存儲(chǔ)任意類型的對(duì)象。
字典dict定義,它里面的元素是“健值對(duì)”形式,包裹在花括號(hào){ }里面,用冒號(hào)(:)將鍵key與值value隔開;“鍵值對(duì)”之間用逗號(hào)(,)分開,也就是元素之間用逗號(hào)(,)分開,這點(diǎn)和list,tuple是一樣的。
key與value 之間是一種映射關(guān)系,格式如下:
創(chuàng)建字典,實(shí)例代碼:
字典鍵key的兩個(gè)特性:
1)鍵key在字典里是唯一的,不允許同一個(gè)鍵Key出現(xiàn)兩次。
2)鍵key的類型必須是不可變的,如數(shù)字,字符串,元組等;
鍵key對(duì)應(yīng)的值value可以是任何數(shù)據(jù)類型。
我們可以通過setdefault()方法為value設(shè)置默認(rèn)值,如:
dict_org.setdefault('sex', 'man')
如何獲取字典dict的值,實(shí)例代碼:
注意了,訪問元素時(shí)如果key不存在會(huì)報(bào)KeyError異常。
用dict.get(key)方法獲取指定鍵key的值value,實(shí)例代碼如下:
注意:如果指定的鍵key不存在(比如上面的'sex')是需要指定一個(gè)默認(rèn)值的,否則會(huì)報(bào)錯(cuò)的。如果鍵key存在,值不存在,返回默認(rèn)值。
如何來更新字典呢,實(shí)例代碼:
注意上面的'tel',它是一個(gè)不存在的鍵key,通過 = 賦值后會(huì)作為新元素被添加到字典里面;
如果這個(gè)'tel'鍵key已經(jīng)存在,通過 = 賦值后只會(huì)做修改操作。
總結(jié)一下:用 = 賦值時(shí),key存在就修改,不存在就添加;
我們也可以用dict.update()方法來更新字典dict,實(shí)例代碼:
我們發(fā)現(xiàn)兩個(gè)字典里都有一個(gè)同名鍵'year',update()方法會(huì)去重,再把dict2里的內(nèi)容更新到dict1里,以確保字典里的鍵key是唯一的。
如何來刪除字典對(duì)象及呢,實(shí)例代碼:
dict.pop(key)會(huì)返回被刪除的值,同時(shí)字典本身也變更了;
如果刪除一個(gè)不存在的key,是要指定默認(rèn)值key的,否則會(huì)報(bào)錯(cuò),如:dict_org.pop('tel','phone')
還可以用我們熟悉的del語句刪除元素和字典對(duì)象,實(shí)例代碼:
注意:del語句可以刪除字典里的單個(gè)元素,dict.clear()方法是清空字典dict里面的所有元素。
注意:del語句可以刪除整個(gè)字典對(duì)象,刪除以后dict_org字典對(duì)象就不存在了,再訪問就會(huì)報(bào)錯(cuò)。
類型轉(zhuǎn)換 str(dict),實(shí)例代碼:
判斷鍵key是否存,用 in 或 not in 操作符,實(shí)例代碼:
常用的幾個(gè)字典方法
其實(shí)前面已經(jīng)用過一些字典方法了,下面再補(bǔ)充幾個(gè):
dict.items()返回一個(gè)可迭代對(duì)象,它把k:v健值對(duì)轉(zhuǎn)換成元組存為列表的元素,其結(jié)果類似“列表嵌套元組”,實(shí)例代碼:
我們可以通過遍歷items()把字典dict編排成一個(gè)新列表list,相當(dāng)于list(dict)方法的實(shí)現(xiàn)過程,代碼如下:
提取字典里的所有鍵:keys() 方法返回一個(gè)可迭代對(duì)象,相當(dāng)于字典的key集合,可以使用 list() 來轉(zhuǎn)換為列表,實(shí)例代碼:
提取字典里的所有值:values() 方法返回一個(gè)可迭代對(duì)象,相當(dāng)于字典的value集合,可以使用 list() 來轉(zhuǎn)換為列表,實(shí)例代碼:
創(chuàng)建字典,dict.fromkeys(seq,v),將seq中的元素做為字典元素的key。
下面重點(diǎn)說下字典的淺拷貝和深拷貝,以及與直接賦值的區(qū)別;
直接賦值:其實(shí)就是對(duì)象的引用(對(duì)象的一個(gè)標(biāo)簽名,別名而已)。
淺拷貝(dict.copy()):拷貝父對(duì)象,不會(huì)拷貝對(duì)象的內(nèi)部的子對(duì)象。
深拷貝(copy.deepcopy()): 它是copy模塊的deepcopy方法,完全拷貝了父對(duì)象及其子對(duì)象。
先來看下直接賦值和淺拷貝:
我們?cè)倏纯瓷羁截?,需要?dǎo)入copy模塊:
總節(jié)一下:
用等號(hào) = 是賦值引用,a,b其實(shí)是同一條引用,這個(gè)引用又指向了對(duì)象obj
淺拷貝后雖然dict_a,dict_b是兩個(gè)獨(dú)立對(duì)象,即兩個(gè)引用,這兩個(gè)引用又指向同一個(gè)對(duì)象obj。只要更新其中一個(gè),另外一個(gè)也會(huì)跟更新。
深拷貝后dict_a,dict_b是兩個(gè)完全獨(dú)立對(duì)象,它倆完全拷貝了父對(duì)象及其子對(duì)象;也就是說每個(gè)引用不再指向同一個(gè)對(duì)象,而是各自有了獨(dú)立的指向?qū)ο?,所以深拷貝后修改字典是互不影響的?/p>
copy模塊也有個(gè)淺拷貝方法copy.copy(obj),大家可以自己試下;copy模塊針對(duì)的所有python對(duì)象的拷貝;
總結(jié)一下: 等號(hào)=賦值和淺拷貝后,指向沒變;深拷貝后,指向獨(dú)立了。
OK!Python數(shù)據(jù)類型的字典dict就分享到這里,如果您有什么問題,請(qǐng)?jiān)谠u(píng)論區(qū)留言,我會(huì)及時(shí)回復(fù),感謝!
聯(lián)系客服