維也納的雨落 2018-08-13 19:02:19 1. 概念與創(chuàng)建字典映射類型是一種關(guān)聯(lián)式的容器類型,它存儲了對象與對象之間的映射關(guān)系,。簡而言之就是通過名稱來訪問其各個值得數(shù)據(jù)結(jié)構(gòu),,這種數(shù)據(jù)結(jié)構(gòu)稱為映射。 字典的每個鍵值 key,,value 對用冒號 : 分割,,每個鍵值對之間用逗號 , 分割,整個字典包括在花括號 {} 中,,字典由鍵-值對稱為項(item) ,格式如下所示: >>> d = {key1 : value1, key2 : value2 } >>> dir = {'Jack' : 'US', 'Ammy' : 'China'} 字典是Python內(nèi)置映射類型,,其值不按順序排列,而是儲存在鍵值下,。鍵可以是數(shù),、字符串或元組。 對于字典來講索引是行不通的 對字典進行索引 字典中鍵只有在值和類型完全相同的時候才視為一個鍵: >>> dir = { 1 : 1 ,'1' :1} #dir[1]和dir['1']是不同的 2.函數(shù)dict可以用函數(shù)dict從其他映射(如其他字典)或鍵-值對序列創(chuàng)建字典,。 還可以用關(guān)鍵字實參來調(diào)用這函數(shù) --- 3. 基本的字典操作1. len(d):返回字典d包含的項(鍵-值對)數(shù),。 2. d(k):返回與鍵k相關(guān)聯(lián)的值。 3. d(k) = v:值v關(guān)聯(lián)到鍵k,。 4. del [k]:刪除鍵k的項,。 5. k in d:檢查字典d是否包含鍵k的項。 鍵的類型:字典中的鍵可以是整數(shù)也可以是非整數(shù),。字典中的鍵可以是任何不可變的值,,如浮點數(shù)、字符串或元組,。 自動添加:即使字典中原來沒有鍵,,也可以給它賦值,這將在字典中創(chuàng)建一個新項,。然而,,如果不適用append或其它方法,就不能給列表中原有的元素賦值,。 成員資格:表達式k in d(d是一個字典)查找的是鍵而不是值,,而表達式v in l(l 是一個列表)查找的是值而不是索引。 --- 鍵可以是任何不可變的類型 在嘗試給空列表索引42的元素,,但因為為沒有這種元素顯然是不可能的,。 字典中這么做一點問題也沒有,相當于在字典中添加了一個新項,。 4. 字典方法①clear 刪除所有的字典項,,因此什么都不返回也可以說返回None clear基本用途 首先字典里包括了name以及名字jack,當我把x值賦值給y時,,顯然y和x是一樣的,。如果把x賦值為空,打印出來的x就為空字典,,但字典y還有內(nèi)容,。顯然如果這不是你想要的結(jié)果的話,用clear試試 --- 用clear函數(shù) 賦值 首先字典里包括了name以及名字jack,,當我把x值賦值給y時,,顯然y和x是一樣的。如果把x賦值為空,,打印出來的x就為空字典,,但字典y還有內(nèi)容。顯然如果這不是你想要的結(jié)果的話,,用clear試試 clear清除 打印出來的字典x和y都為空 ②copy 返回一個新字典,,其包含的鍵-值對與原來的字典相同(這種為淺復制,,因為值本身是原件,而非副本) 當替換副本中的值,,原件不受影響,。但是如果修改副本的值(修改不是替換),原件也發(fā)生變化,,因為原件指向的也是被修改的值,。 --- 為了避免上述的問題,可執(zhí)行深層拷貝,,用到copy模塊中的函數(shù)deepcopy 1. copy.copy 淺拷貝 只拷貝父對象,,不會拷貝對象的內(nèi)部的子對象。(比深拷貝更加節(jié)省內(nèi)存) 2. copy.deepcopy 深拷貝 拷貝對象及其子對象 用一個簡單的例子說明如下: >>>import copy >>>a = [1, 2, 3, 4, ['a', 'b', 'c']] >>> b = a >>> c = copy.copy(a) >>> d = copy.deepcopy(a) 很容易理解:a是一個列表,,表內(nèi)元素a[4]也是一個列表(也就是一個內(nèi)部子對象),;b是對a列表的又一個引用,所以a,、b是完全相同的,可以通過id(a)==id(b)證明,。 第4行是淺拷貝,,第五行是深拷貝,通過id(c)和id(d)可以發(fā)現(xiàn)他們不相同,,且與id(a)都不相同: >>> id(a) 19276104 >>> id(b) 19276104 >>> id(c) 19113304 >>> id(d) 19286976 至于如何看深/淺拷貝的區(qū)別,,可以通過下面的操作來展現(xiàn): >>> a.append(5) #操作1 >>> a[4].append('hello') #操作2 這時再查看結(jié)果: >>> a [1, 2, 0, 4, ['a', 'b', 'c', 'hello'], 5] >>> b [1, 2, 0, 4, ['a', 'b', 'c', 'hello'], 5] >>> c [1, 2, 3, 4, ['a', 'b', 'c', 'hello']] >>> d [1, 2, 3, 4, ['a', 'b', 'c']] 可以發(fā)現(xiàn)a、b受了操作1,、2的影響,,c只受操作2影響,d不受影響,。a,、b結(jié)果相同很好理解。由于c是a的淺拷貝,,只拷貝了父對象,,因此a的子對象( ['a', 'b', 'c', 'hello'])改變時會影響到c;d是深拷貝,,完全不受a的影響,。 ③get 如果試圖訪問字典中沒有的元素,將引發(fā)錯誤,。 如果使用get將不會發(fā)生錯誤 用get元素沒有引發(fā)異常,,而是返回None。而且可以指定值而不是None ④items 返回一個包含所有字典項的列表,,其中每個元素都為(key,,value)的形式,,字典項目在列表中排列順序不確定。 還可以對長度進行檢查 >>> it= d.items() >>> len(it) > 3 ⑤pop 獲取與指定鍵相關(guān)的值,,并將該鍵-值對從字典中刪除 >>> d = {'x':1,'y':2} >>> d.pop(x) > 1 >>> d > {'y':2} |
|