补充变量的内存存储
字典
概念
字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据,python对key进行哈希函数运算,根据计算结果决定value的存储地址,所以字典是无序的(python3.5之前是无序的,在python3.6以后 dict 是有序的 ),且key必须是可哈希的
可哈希 :不可变类型
int
str
tuple
bool
不可哈希:可变类型
list
- dict
理解
字典是通过key-value的方法,键值是一一对应的 可以通过键找到值,字典的 key 是不可以重复的
在内存中的存储:
字典创建时会开辟一定空间存放key ,当存入key-value 的时候 会根据key进行哈希函数运算,计算出value的内存地址。
方法
动态创建字典——fromkeys
>>> {}.fromkeys(['k1','k2'],[])
{'k1': [], 'k2': []}s
增
基础方法
>>> dic = {'name':'charmNight', 'age':18, 'sex':'n'}
>>> dic['work':'student']
>>> dic
{'name':'charmNight', 'age':18, 'sex':'n', 'work':'student'}
setdefault( k, d=None)
有返回值:返回value
只能添加不能进行修改
>>> dic = {'name':'charmNight', 'age':18, 'sex':'n'}
>>> dic.setdefault('work')
>>> dic
{'name': 'charmNight', 'age': 18, 'sex': 'n', 'work': None}
# 可以发现setdefault() 默认value 为 None
>>> dic = {'name':'charmNight', 'age':18, 'sex':'n'}
>>> dic.setdefault('work', 'student')
student
>>> dic
dic = {'name':'charmNight', 'age':18, 'sex':'n', 'work':'student'}
>>> dic = {'name':'charmNight', 'age':18, 'sex':'n'}
>>> dic.setdefault('name','Over')
charmNight
>>> dic
dic = {'name':'charmNight', 'age':18, 'sex':'n'}
# 可以发现 setdefault()只能添加不能进行修改
拓展
setdefault() 其实是先进行了一句 get()方法
删
pop(k,[,d])
根据key删除
有返回值 如果删除成功返回 删除的key对应的值
如果删除失败, 返回d 的内容 , 如果d 不写则报错
>>> dic = {'name':'charmNight', 'age':18, 'sex':'n'}
>>> dic.pop('name')
charmNight
>>> dic
{'age':18, 'sex':'n'}
>>> dic = {'name':'charmNight', 'age':18, 'sex':'n'}
>>> dic.pop('asd')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'asd'
>>> dic = {'name':'charmNight', 'age':18, 'sex':'n'}
>>> dic.pop('asd', None)
None
popitem()
随机删除 python3.6测试 一般删除最后一个
有返回值:返回的是一个元祖 (key,value)
>>> dic = {'name':'charmNight', 'age':18, 'sex':'n'}
>>> dic.popitem()
('sex','n')
del
用法一
del dic[‘key’] 删除key 与 value 删除失败报错
>>> dic = {'name':'charmNight', 'age':18, 'sex':'n'}
>>> del dic['name']
>>> dic
{'age':18, 'sex':'n'}
>>> dic = {'name':'charmNight', 'age':18, 'sex':'n'}
>>> del dic['name123']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'name123'
用法二
del dic 删除整个字典
>>> dic = {'name':'charmNight', 'age':18, 'sex':'n'}
>>> del dic
clear
清空字典
>>> dic = {'name':'charmNight', 'age':18, 'sex':'n'}
>>> dic.clear()
>>> dic
{}
改
update(E=None, **F)
通过update增加 ,如果有重复的key 则进行修改
dic.update(dic2) 是dic 中如果没有 dic2中的元素则增加 在dic中重新开辟内存空间 如果有 就是 直接指向dic2 的value的内存地址
dic = {'name':'charm','age':18,'sex':'n'}
dic2 = {'name':'Game', 'str':'asd'}
dic.update(dic2)
print(dic)
{'name': 'Game', 'age': 18, 'sex': 'n', 'str': 'asd'}
拓展
当dic2修改的时候 dic2[‘name123’]
查
get()
# 查询如果找到则返回value 如果找不到 默认为None
# print(dic.get('name1'))
# print(dic.get('name1','Over'))
# 查找 如果找到返回value 找不到则报错
# print(dic['name'])
keys()、values()、items()
print(dic.keys(),type(dic.keys())) # dict_keys(['name', 'age', 'sex']) <class 'dict_keys'>
print(dic.values(),type(dic.values())) # dict_values(['charm', 18, 'n']) <class 'dict_values'>
print(dic.items(),type(dic.items())) # dict_items([('name', 'charm'), ('age', 18), ('sex', 'n')]) <class 'dict_items'>
for i in dic:
print(i)
for i in dic.keys():
print(i)
for i in dic.values():
print(i)
for k,v in dic.items():
print(k,v)
补充
.items() 方法其实是找的keys 然后又根据keys找了一遍values
但是效率不如 .keys()高
for i in dic.keys():
print(dic[i])
的效率大于
for k,v in dic.items():
print(k,v)
应用
字典中的值可以是任意内容
def demo1():
print('这是第一个demo')
def demo2():
print('这是第二个demo')
dic = {}.fromkeys(['1','2'],None)
print(dic)
dic['1'] = demo1()
dic['2'] = demo2()
for i in range(10):
if i in dic.keys():
print(i)
else:
pass