第八章 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存在就修改,不存在就添加;

4dict.update()方法来更新字典dict

实例代码:

 

 

 我们发现两个字典里都有一个同名键'year',update()方法会去重,再把dict2里的内容更新到dict1里,以确保字典里的键key是唯一的。

5如何来删除字典对象

实例代码:

 

 dict.pop(key)会返回被删除的值,同时字典本身也变更了;

如果删除一个不存在的key,是要指定默认值key的,否则会报错,

如:dict_org.pop('tel','phone')

6del语句删除元素和字典对象

实例代码:

 

 

 注意: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对象的拷贝;

总结一下: 等号=赋值和浅拷贝后,指向没变;深拷贝后,指向独立了。

posted @ 2019-10-01 21:54  在软件技术路上的行者  阅读(200)  评论(0编辑  收藏  举报