映射类型是一种关联式的容器类型,它存储了对象与对象之间的映射关系。简而言之就是通过名称来访问其各个值得数据结构,这种数据结构称为映射。
字典的每个键值 key,value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中,字典由键-值对称为项(item) ,格式如下所示:
>>> d = {key1 : value1, key2 : value2 }
>>> dir = {'Jack' : 'US', 'Ammy' : 'China'}
字典是Python内置映射类型,其值不按顺序排列,而是储存在键值下。键可以是数、字符串或元组。
对于字典来讲索引是行不通的
对字典进行索引
字典中键只有在值和类型完全相同的时候才视为一个键:
>>> dir = { 1 : 1 ,'1' :1} #dir[1]和dir['1']是不同的
可以用函数dict从其他映射(如其他字典)或键-值对序列创建字典。
还可以用关键字实参来调用这函数
---
1. len(d):返回字典d包含的项(键-值对)数。
2. d(k):返回与键k相关联的值。
3. d(k) = v:值v关联到键k。
4. del [k]:删除键k的项。
5. k in d:检查字典d是否包含键k的项。
键的类型:字典中的键可以是整数也可以是非整数。字典中的键可以是任何不可变的值,如浮点数、字符串或元组。
自动添加:即使字典中原来没有键,也可以给它赋值,这将在字典中创建一个新项。然而,如果不适用append或其它方法,就不能给列表中原有的元素赋值。
成员资格:表达式k in d(d是一个字典)查找的是键而不是值,而表达式v in l(l 是一个列表)查找的是值而不是索引。
---
键可以是任何不可变的类型
在尝试给空列表索引42的元素,但因为为没有这种元素显然是不可能的。
字典中这么做一点问题也没有,相当于在字典中添加了一个新项。
①clear
删除所有的字典项,因此什么都不返回也可以说返回None
clear基本用途
首先字典里包括了name以及名字jack,当我把x值赋值给y时,显然y和x是一样的。如果把x赋值为空,打印出来的x就为空字典,但字典y还有内容。显然如果这不是你想要的结果的话,用clear试试
---
用clear函数
赋值
首先字典里包括了name以及名字jack,当我把x值赋值给y时,显然y和x是一样的。如果把x赋值为空,打印出来的x就为空字典,但字典y还有内容。显然如果这不是你想要的结果的话,用clear试试
clear清除
打印出来的字典x和y都为空
②copy
返回一个新字典,其包含的键-值对与原来的字典相同(这种为浅复制,因为值本身是原件,而非副本)
当替换副本中的值,原件不受影响。但是如果修改副本的值(修改不是替换),原件也发生变化,因为原件指向的也是被修改的值。
---
为了避免上述的问题,可执行深层拷贝,用到copy模块中的函数deepcopy
1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象。(比深拷贝更加节省内存)
2. copy.deepcopy 深拷贝 拷贝对象及其子对象
用一个简单的例子说明如下:
>>>import copy
>>>a = [1, 2, 3, 4, ['a', 'b', 'c']]
>>> b = a
>>> c = copy.copy(a)
>>> d = copy.deepcopy(a)
很容易理解:a是一个列表,表内元素a[4]也是一个列表(也就是一个内部子对象);b是对a列表的又一个引用,所以a、b是完全相同的,可以通过id(a)==id(b)证明。
第4行是浅拷贝,第五行是深拷贝,通过id(c)和id(d)可以发现他们不相同,且与id(a)都不相同:
>>> id(a)
19276104
>>> id(b)
19276104
>>> id(c)
19113304
>>> id(d)
19286976
至于如何看深/浅拷贝的区别,可以通过下面的操作来展现:
>>> a.append(5) #操作1
>>> a[4].append('hello') #操作2
这时再查看结果:
>>> 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']]
可以发现a、b受了操作1、2的影响,c只受操作2影响,d不受影响。a、b结果相同很好理解。由于c是a的浅拷贝,只拷贝了父对象,因此a的子对象( ['a', 'b', 'c', 'hello'])改变时会影响到c;d是深拷贝,完全不受a的影响。
③get
如果试图访问字典中没有的元素,将引发错误。
如果使用get将不会发生错误
用get元素没有引发异常,而是返回None。而且可以指定值而不是None
④items
返回一个包含所有字典项的列表,其中每个元素都为(key,value)的形式,字典项目在列表中排列顺序不确定。
还可以对长度进行检查
>>> it= d.items()
>>> len(it)
> 3
⑤pop
获取与指定键相关的值,并将该键-值对从字典中删除
>>> d = {'x':1,'y':2}
>>> d.pop(x)
> 1
>>> d
> {'y':2}
联系客服