內建方法
DICT.setdefault(key,default), DICT.get(key,default)
想像一下,當你要使用dictionary紀錄活動積分,每當達成某個條件,就用score[name] += value
做加分。但是,這會有個問題,就是活動中,有可能會有新使用者加入,而新使用者原先不在dictionary裡,所以上述的方法會產生keyerror。於是根據我們前面所學的,我們可以透過name in score
,去判斷是否為新使用者。
上述的方法固然不錯,但是,這樣還要特地去判斷新使用者,於是我們可以使用setdefault這個內建方法,他的用法是key為你要查詢的key,default會是一個value,如果key在dictionary裡,回傳其對應的value,否則回傳default。
score[name] = value + score.setdefault(name,default)
如上所述,我們就不用特別為了新使用者多寫兩行的if,也讓code看起來更舒服。
而把setdefault換成get,上面的code也會有一樣的功能,但是setdefault跟get有甚麼差別呢? 當你呼叫
score.setdefault(name,default)
時,如果name不是score的key,setdefault會順便幫你把name變成score的key並且assign一個值給他。而get只是單純回傳一個值。
DICT.values()
回傳一個dictionary value的list。
DICT.keys()
回傳一個dictionary key的list。
DICT.items()
還記得enumerate(list)嗎?每次迭代他,都會得到一個tuple,包含著index跟value。那麼,items也有類似的效果,每次迭代他,都會獲得一個tuple,包含著key跟value。
DICT.copy()
>>> a = {666 : 168}
>>> b = a
>>> b[666] = 1
>>> print(a)
{666 : 1}
在上面的code,我們發現如果用b = a
,我們只是複製了指向dictionary物件的指標,造成b跟a實質上還是同個東西。因此我們必須使用copy,讓其回傳一個新的物件。
>>> a = {666 : {9487 : 222}}
>>> b = a.copy()
>>> b[777] = 1
>>> print(a)
{666 : {9487 : 222}}
>>> b[666][9487] = 111
>>> print(a)
{666 : {9487 : 111}}
在上面的例子,copy的確給了一份新的,然而,他卻只給了新的一層,也就是shallow copy,而為了解決這種問題,我們必須使用deepcopy,不過這已經超過這門課的範圍,就交給各位自己去查囉~