第八章 python3 字典dict
前面我们了解了列表list和元组tuple两个序列,是存储不同类型数据的容器。
今天我们了解下另外一种容器类型:字典dict,它可以存储任意类型的对象。
1、字典dict定义
它里面的元素是“健值对”形式,包裹在花括号{ }里面,用冒号(:)将键key与值value隔开;“键值对”之间用逗号(,)分开,也就是元素之间用逗号(,)分开,这点和list,tuple是一样的。
key与value 之间是一种映射关系,格式如下:
dict = {key1: value1, key2: value2, key3: value3}
创建字典,实例代码:
字典键key的两个特性:
1)键key在字典里是唯一的,不允许同一个键Key出现两次。
2)键key的类型必须是不可变的,如数字,字符串,元组等;
键key对应的值value可以是任何数据类型。
我们可以通过setdefault()方法为value设置默认值,如:
dict_org.setdefault('sex', 'man')
2、如何获取字典dict的值
实例代码:
注意了,访问元素时如果key不存在会报KeyError异常。
用dict.get(key)方法获取指定键key的值value,
实例代码如下:
注意:如果指定的键key不存在(比如上面的'sex')是需要指定一个默认值的,否则会报错的。如果键key存在,值不存在,返回默认值。
3、如何来更新字典
实例代码:
注意上面的'tel',它是一个不存在的键key,通过 = 赋值后会作为新元素被添加到字典里面;
如果这个'tel'键key已经存在,通过 = 赋值后只会做修改操作。
总结一下:用 = 赋值时,key存在就修改,不存在就添加;
4、用dict.update()方法来更新字典dict
实例代码:
我们发现两个字典里都有一个同名键'year',update()方法会去重,再把dict2里的内容更新到dict1里,以确保字典里的键key是唯一的。
5、如何来删除字典对象
实例代码:
dict.pop(key)会返回被删除的值,同时字典本身也变更了;
如果删除一个不存在的key,是要指定默认值key的,否则会报错,
如:dict_org.pop('tel','phone')
6、用del语句删除元素和字典对象
实例代码:
注意:del语句可以删除字典里的单个元素,dict.clear()方法是清空字典dict里面的所有元素。
注意:del语句可以删除整个字典对象,删除以后dict_org字典对象就不存在了,再访问就会报错。
7、类型转换 str(dict)
实例代码:
8、判断键key是否存,用 in 或 not in 操作符
实例代码:
9、常用的几个字典方法
其实前面已经用过一些字典方法了,下面再补充几个:
9.1dict.items()返回一个可迭代对象
它把k:v健值对转换成元组存为列表的元素,其结果类似“列表嵌套元组”,实例代码:
9.2遍历items()
把字典dict编排成一个新列表list,相当于list(dict)方法的实现过程,
代码如下:
9.3提取字典里的所有键
keys() 方法返回一个可迭代对象,相当于字典的key集合,可以使用 list() 来转换为列表,实例代码:
9.4提取字典里的所有值
values() 方法返回一个可迭代对象,相当于字典的value集合,可以使用 list() 来转换为列表,实例代码:
创建字典,dict.fromkeys(seq,v),将seq中的元素做为字典元素的key。
10、字典的浅拷贝和深拷贝,以及与直接赋值的区别
直接赋值:其实就是对象的引用(对象的一个标签名,别名而已)。
10.1浅拷贝(dict.copy())
拷贝父对象,不会拷贝对象的内部的子对象。
10.2深拷贝(copy.deepcopy())
它是copy模块的deepcopy方法,完全拷贝了父对象及其子对象。
先来看下直接赋值和浅拷贝:
我们再看看深拷贝,需要导入copy模块:
总结一下:
用等号 = 是赋值引用,a,b其实是同一条引用,这个引用又指向了对象obj浅拷贝后,虽然dict_a,dict_b是两个独立对象,即两个引用,这两个引用又指向同一个对象obj。只要更新其中一个,另外一个也会跟更新。
深拷贝后dict_a,dict_b是两个完全独立对象,它俩完全拷贝了父对象及其子对象;也就是说每个引用不再指向同一个对象,而是各自有了独立的指向对象,所以深拷贝后修改字典是互不影响的。
copy模块也有个浅拷贝方法copy.copy(obj),大家可以自己试下;copy模块针对的所有python对象的拷贝;
总结一下: 等号=赋值和浅拷贝后,指向没变;深拷贝后,指向独立了。