![Python 3.6零基础入门与实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/591/26793591/b_26793591.jpg)
2.7 字典
字典的概念来自英文Dictionary的翻译,意思是一对key-value的组合值,通常称为键-值对。本节将介绍Python中的字典。
2.7.1 使用字典
在Python中,使用{}定义字典,字典中的键-值对用冒号间隔,比如定义一个字典:
stu1={'学号':'10001','姓名':'张晓光','性别':'男','年龄':20}
在字典中,键是不可变的(数字、字符串、元组),但值是可以改变的,比如要改变上述字典中的年龄为30,可以这样写:
stu1['年龄']=30
注 意
字典中的值可以是任意类型,因为键是不可改变的,所以不能是列表等可变类型。
在字典中,键是唯一的,虽然定义字典时允许输入两个相同的键,但实际上后一个键的值会覆盖上一个键的值,比如以下代码定义了重复的“姓名”键:
stu1={'学号':'10001','姓名':'张晓光','姓名':'李三','年龄':20}
stu1['姓名']输出的结果会是‘李三’。
上面我们演示的键都是字符串,其实键还可以是数字或元组,比如下面定义一组数字键:
day={1:'星期一',2:'星期二',3:'星期三'}
print(day[1])
也可以使用混合类型的键,比如既有数字键又有字符串的键:
day={1:'星期一',2:'星期二',3:'星期三','四':'星期四'}
print(day['四'])
2.7.2 访问字典
访问序列中的元素基本都用[],字典也不例外。因为元素是键-值对,所以[]中还需要指定要访问的键。比如stu1['姓名']就是访问“姓名”键所对应的值。
注 意
访问列表或元组时,可以使用stu1[索引]的方式,但字典中并不可以,比如使用索引[0]并不会访问第1个元素,而是访问键为0的元素。
下面举例:
day={1:'星期一',2:'星期二',3:30,'四':'星期四'}
print(day['四']) #星期四 print(day[2]) #星期二
2.7.3 字典常用的内置函数
字典中包括一些返回值、返回键的方法,如表2.9所示。
表2.9 字典常用的内置函数
![](https://epubservercos.yuewen.com/7779CF/15253385805231106/epubprivate/OEBPS/Images/Figure-T64_49904.jpg?sign=1739284408-VHF3ZOFb4hW81QKKBIfblHUX4b6L4vLt-0-0bf1307d50f1c8d0ac6c15548264fb96)
说 明
一旦定义一个变量,其在内存中占据的位置一般不可变,都是通过一个引用指向该变量。如果复制某个变量,也只是增加一个引用,具体位置还是不变,这个时候就是浅拷贝;如果增加引用的同时具体位置也发生了变化,这种称为深拷贝。
下面举例:
【示例2-26】
![](https://epubservercos.yuewen.com/7779CF/15253385805231106/epubprivate/OEBPS/Images/Figure-P65_49908.jpg?sign=1739284408-L7eWENUWsHT9D84SfLPFve5e5bKgF9zC-0-839ef19c12992cb3976b9ea0b6367d42)
输出结果如图2-14所示。
![](https://epubservercos.yuewen.com/7779CF/15253385805231106/epubprivate/OEBPS/Images/Figure-P65_15768.jpg?sign=1739284408-aSjgfGVK7lKPEU2DrbwrUvndN3PZ2j23-0-48c0f8343c78dbfa7c790e8dc961805c)
图2.14 字典内置函数应用
这里要特别说明几点:
(1)如果是通过=赋值的方式创建一个新的字典,使用的就是浅拷贝,也就是说,并不开辟一块内存保存新字典。如果是通过copy函数创建一个新字典,就是深拷贝方式,通过id(dict)输出的内存地址信息可以判断。
(2)get和setdefault都可以获取指定键的值,但如果指定的键并不存在,get就返回默认值None,而setdefault就会将指定的键添加到字典中。
(3)update是将指定的字典更新到当前字典中,但如果指定的字典中并不包含值,也就是只有键的情况,如{'张三','上海'}这种形式,代码并不报错,而是自动分割键,给当前字典增加键值对,比如增加后是{'张':'三','上':'海'}这种形式。因此,在使用update时要检查仔细。
2.7.4 删除字典
删除字典的方法有很多种,如clear、pop、popitem、del等,这些有的只能删除字典元素,有的可以删除字典,具体说明如下:
• clear():清空字典中所有键-值对。
• pop(key):删除指定键的键-值对,有返回值,返回值为被删除的值。
• popitem():删除最后一项键-值对,有返回值,返回值为被删除的键-值对。
• del:删除字典元素或字典,如果删除的是字典,再访问字典时会报错。
(1)首先介绍clear,清空字典后,如果再访问字典,就不会报错,返回{}。
![](https://epubservercos.yuewen.com/7779CF/15253385805231106/epubprivate/OEBPS/Images/Figure-P66_49914.jpg?sign=1739284408-C9Kt7TLIVwcuSCJfE2pnttY507yVTu06-0-2035e0530b3cf2e16d9c7093826de914)
(2)pop函数在使用时有两个步骤:
• 一是在字典中删除键-值对。
• 二是返回被删除的值。
因为有返回值,所以可以定义一个变量接收该值,例如:
![](https://epubservercos.yuewen.com/7779CF/15253385805231106/epubprivate/OEBPS/Images/Figure-P66_49912.jpg?sign=1739284408-WEcOfNoq3DEiJWqLskS040GY69eM3c5N-0-f761d74d7e62dcce3e363a6a48809502)
(3)popitem没有参数,默认是删除最后一项键-值对(返回元组),例如:
![](https://epubservercos.yuewen.com/7779CF/15253385805231106/epubprivate/OEBPS/Images/Figure-P66_49913.jpg?sign=1739284408-jku3Rq2gUUHfgGovBgB6BoFmJTSsjqaj-0-64b68e41654aeabf42a9012f1bc6465a)
(4)如果del指定键,则删除的效果和popitem没有区别,但并不返回值;如果del不指定键,则会删除整个字典。
![](https://epubservercos.yuewen.com/7779CF/15253385805231106/epubprivate/OEBPS/Images/Figure-P67_49915.jpg?sign=1739284408-JDKognmWIEma8UrEgay21BAPz9zECUcs-0-fb0245bde776262eec80d57a6cf95cb5)
因为第2次用del删除了字典,所以访问时会报错,如图2.15所示。
![](https://epubservercos.yuewen.com/7779CF/15253385805231106/epubprivate/OEBPS/Images/Figure-P67_15892.jpg?sign=1739284408-AIhQIWTYodL1e168ZX9ZQ7KCNFcGSpkf-0-f18460bd6d7697f99035e519eb8a356b)
图2.15 删除字典报错
2.7.5 字典常用运算符
字典没有+、*运算符,只有in运算符,用于判断指定的键是否在字典中,或者使用not in判断指定的键是否不在字典中。
下面举例:
【示例2-27】
![](https://epubservercos.yuewen.com/7779CF/15253385805231106/epubprivate/OEBPS/Images/Figure-P67_49916.jpg?sign=1739284408-ISJzXnu0QOxQCgCAylAVteyEax0SM4Nu-0-b4453e8388b5ff659556523c88c91074)
上述代码使用if做了两次判断,第1次判断字典中是否有“姓名”键,如果有,就输出该键对应的值。第2次判断是否没有“性别”键,如果没有,就使用setdefault添加该键,并输出当前字典。代码输出结果是:
张晓光 {'姓名': '张晓光', '年龄': 20, '性别': '男'}