目录
字典
字典元素的修改和插入
给指定键的元素赋值时,如果该键在字典中已存在,则会将该键对应 的元素值做修改;如果该键在字典中不存在,则会在字典中插入一个 新元素。
另外,也可以使用字典中的update方法一次修改或插入多个元素, update方法的语法格式为:
d.update(d2) #用另一个字典对象d2的元素修改或插入字典对象d的元素
或
d.update(键1=值1, 键2=值2, …, 键N=值N) #用键值列表修改或插入字典 #对象d的元素
举例
stu=dict(sno='1810101') #创建字典对象并赋给变量stu
print(stu)
stu['sno']='1810100' #将键为'sno'的元素的值修改为'1810100'
print(stu)
stu['name']='小明' #插入一个键为'name'的元素,其值为'李晓明'
print(stu)
stu.update({'name':'小红','age':19})
print(stu)
stu.update(name='张刚',major='计算机')
print(stu)
# 输出
'''
{'sno': '1810101'}
{'sno': '1810100'}
{'sno': '1810100', 'name': '小明'}
{'sno': '1810100', 'name': '小红', 'age': 19}
{'sno': '1810100', 'name': '张刚', 'age': 19, 'major': '计算机'}
'''
字典的删除操作
使用del可以删除某个元素, 也可以使用字典中的pop方 法删除指定键的元素。
pop 方法的语法格式为:d.pop(key[, default])
其作用是从字典d中删除键 为key的元素并返回该元素 的值;如果d中不存在键为 key的元素,则返回default 参数的值.
举例
d=dict(sno='1810100', name='李晓明', age=19)
print('第2行输出的字典d:', d)
del d['age'] #使用del删除d中键为'age'的元素
name=d.pop('name') #使用pop删除d中键为'name'的元素,并将返回的元素值赋给name
print('name的值为:', name)
print('第6行输出的字典d:', d)
major=d.pop('major','Not found')
print('major的值为:', major)
# 输出
'''
第2行输出的字典d: {'sno': '1810100', 'name': '李晓明', 'age': 19}
name的值为: 李晓明
第6行输出的字典d: {'sno': '1810100'}
major的值为: Not found
'''
1. 已知执行“d=dict(sno='1810100', name='李晓明', age=19)”,则执行“r=del d['age']”后,r的值为19。
A.正确
B.错误
正确答案:B
解析:使用del命令删除元素时没有返回值。如果需要获取删除字典元素的值,应使用字典的pop方法,如r=d.pop('age')。
浅拷贝
使用字典中的copy方法可以实现一个字典的浅拷贝。copy 方法的语法格式为:
d.copy()
其作用是返回一个对字典d进行浅拷贝而得到的新字典。
示例
stu1 = {"name":'小明', "age":'19', "score":{"python":'95', 'math':'92'}}
stu2 = stu1 # 直接赋值,此时stu2和stu1指向同一个字典对象
stu3 = stu1.copy()
print(stu1, stu2, stu3)
print("stu1, stu2, stu3的内存地址分别为:", id(stu1), id(stu2), id(stu3))
# 输出
'''
{'name': '小明', 'age': '19', 'score': {'python': '95', 'math': '92'}}
{'name': '小明', 'age': '19', 'score': {'python': '95', 'math': '92'}}
{'name': '小明', 'age': '19', 'score': {'python': '95', 'math': '92'}}
stu1, stu2, stu3的内存地址分别为: 2806786562880 2806786562880 2806786562944
修改stu1中部分键的值
stu1['name'] = '小红'
print(stu1, stu2, stu3)
# 输出
'''
{'name': '小红', 'age': '19', 'score': {'python': '95', 'math': '92'}}
{'name': '小红', 'age': '19', 'score': {'python': '95', 'math': '92'}}
{'name': '小明', 'age': '19', 'score': {'python': '95', 'math': '92'}}
浅拷贝存在的问题:
浅拷贝虽然能够解决生成新的字典对象,而且这两个字典对象之间元素是相互独立的,但如果字典对象中某个元素它的值又是一个可变类型对象,那么对可变类型元素的某个元素进行修改,它们之间也会存在关联,就不存在取值的独立性了。深拷贝可以解决这个问题
查看键'score'的内存地址
print("stu1['score']和stu3['score']的内存地址分别为:", id(stu1['score']), id(stu3['score']))
# 输出
'''
stu1['score']和stu3['score']的内存地址分别为: 2737357396608 2737357396608
'''
修改stu1['socre']['python']的值
stu1['score']['python'] = 100
print(stu1, stu3)
# 输出
'''
{'name': '小红', 'age': '19', 'score': {'python': 100, 'math': '92'}}
{'name': '小明', 'age': '19', 'score': {'python': 100, 'math': '92'}}
'''
深拷贝
1. 使用copy模块的deepcopy方法可以实现深拷贝
deepcopy方法的 语法格式为:copy.deepcopy(d)
其作用是根据字典d进行深拷贝创建一个新的字典对象并返回。
2. 深拷贝不仅使得原有字典对象和生成的字典对象对应不同的内存空间,而且使得两个字典对象中的可变类型元素对应不同的内存空间,从而使得两个字典对象完全独立。
import copy
stu1 = {"name":'小明', "age":'19', "score":{"python":'95', 'math':'92'}}
stu2 = copy.deepcopy(stu1)
print("stu1, stu2的内存地址分别为:", id(stu1), id(stu2))
print("stu1['score']和stu2['score']的内存地址分别为:", id(stu1['score']), id(stu2['score']))
# 输出
'''
stu1, stu2的内存地址分别为: 2504113855296 2504116826752
stu1['score']和stu2['score']的内存地址分别为: 2504113855104 2504116829632
'''
修改stu1['socre']['python']的值
stu1['score']['python'] = 100
print(stu1, stu2)
# 输出
'''
{'name': '小明', 'age': '19', 'score': {'python': 100, 'math': '92'}}
{'name': '小明', 'age': '19', 'score': {'python': '95', 'math': '92'}}
1、已知“a=dict(x=1,y=2)”且“b=a”,则执行“a['y']=10”后,则print(b)的输出结果为( )。
A.{x=1,y=10}
B.{x=1,y=2}
C.{'x':1,'y':10}
D.{'x':1,'y':2}
正确答案:C
解析:通过“b=a”,则b和a对应的是同一块内存中的数据。通过“a['y']=10”将a所对应数据中键为'y'的元素修改为10,则b中元素也会同时改变。
2、如果字典a中包含可变类型的元素,则在用a给b赋值时,应使用copy模块的deepcopy函数,以使得a和b中各元素的取值具有完全的独立性。
A.正确
B.错误
正确答案:A
解析:在用a给b赋值时,如果字典a中不包含可变类型的元素,则使用浅拷贝(调用copy模块的copy函数)就可以使a和b中各元素的取值具有完全的独立性。但如果字典a中包含可变类型的元素,则需要使用深拷贝(调用copy模块的deepcopy函数)才能使a和b中各元素的取值具有完全的独立性,此时如果用浅拷贝则在修改a中可变类型元素中的元素时、b中对应可变类型元素的值也会同时改变。
判断字典中是否存在键
1、已知“d=dict(x=1,y=2)”,则d.get('z')返回的结果是( )。
A.None
B.default
C.null
D.报错
正确答案:A
解析:调用字典的get方法时,如果没有指定default参数,则键不存在时返回None;如果指定了default参数,则键不存在时返回给default参数指定的值。
拼接两个字典
2、已知d1和d2是两个字典对象,则直接执行“dMerge=dict(d1,**d2)”与先执行“dMerge=d1.copy()”、再执行“dMerge.update(d2)”的效果完全相同。
A.正确
B.错误
正确答案:A
解析:dict(d1,**d2)返回的字典中包含了d1和d2这两个字典中的所有元素;而先通过dMerge=d1.copy()将d1的副本赋给dMerge(此时dMerge中包含了d1中的所有元素),再通过dMerge.update(d2)将d2中的元素更新到dMerge中(此时dMerge中包含了d1和d2的所有元素)。二者的执行效果完全相同。
字典其他常用操作
计算字典中元素个数
使用Python提供的len方法可以计算字典中的元素个数,
len方法的语法格式为:len(d),其中,d为要计算元素个数的字典。
举例
d=dict(sno='1810100', name='李晓明', age=19) #创建字典对象并赋给变量d
print('字典d中的元素个数为:', len(d))
# 输出
'''
字典d中的元素个数为: 3
'''
清除字典中所有元素
使用字典中的clear方法可以一次将一个字典中的所有元素 都清除,
clear方法的语法格式为:d.clear(),其中,d为要清除元素的字典。
举例
d=dict(sno='1810100', name='李晓明', age=19) #创建字典对象并赋给变量d
print('字典d中的元素个数为:', len(d))
d.clear() #调用clear方法清除d中的所有元素
print('字典d中的元素个数为:', len(d))
#输出
'''
字典d中的元素个数为: 3
字典d中的元素个数为: 0
'''
获取字典中键集合
使用字典中的keys方法可以获取一个字典所有的键,
keys 方法的语法格式为:d.keys(),其作用是返回一个包含d中所有键的对象。
d=dict(sno='1810100', name='李晓明') #创建字典对象并赋给变量d
print('d中的键为:', d.keys())
# 输出
'''
d中的键为: dict_keys(['sno', 'name'])
'''
获取字典中值集合
使用字典中的values方法可以获取一个字典所有的值,
values方法的语法格式为:d.values(),其作用是返回一个包含d中所有值的对象。
举例
d=dict(sno='1810100', name='李晓明') #创建字典对象并赋给变量d
print('d中的值为:', d.values())
# 输出
'''
d中的值为: dict_values(['1810100', '李晓明'])
'''
获取字典中元素数组
使用字典中的items方法可以返回一个可按(键, 值)方式遍 历的对象,
items语法格式为:d.items()
举例
d=dict(sno='1810100', name='李晓明') #创建字典对象并赋给变量d
for key,value in d.items():
print(key,value)
# 输出
'''
sno 1810100
name 李晓明
'''
注:提示:如果直接在字典上做遍历, 则每次只能获取到一个元素的键, 然后再通过键去获取该元素的值。
d=dict(sno='1810100', name='李晓明') #创建字典对象并赋给变量d
for key in d:
print(key)
'''
sno
name
'''
1、已知“d=dict(x=1,y=2)”,则执行“d.clear()”后,“len(d)”返回的结果是( )。
A.0
B.1
C.2
D.报错
正确答案:A
解析:字典的clear方法的作用是将字典中的元素清空。因此执行“d.clear()”方法后,d中没有任何元素,再执行“len(d)”返回字典中元素个数为0。
2、通过“d.keys()”可以获取由字典d中所有键组成的一个对象。
A.正确
B.错误
正确答案:A
解析:字典的keys方法返回由字典中所有键组成的一个对象,values方法返回由字典中所有值组成的一个对象,items方法返回由字典中所有元素的(键,值)组成的一个对象。
元组
如果使用()创建的元组中只包含单个元素,则需要在这唯一的 一个元素后面添加逗号,否则小括号会被系统认为是括号运 算符、而不会被认为是在创建元组。