stu_dict = {
'小明': 14,
'小红': 13
}
keys = stu_dict.keys()
values = stu_dict.values()
items = stu_dict.items()
print(type(keys))
<class 'dict_keys'>
print(type(values))
<class 'dict_values'>
print(type(items))
<class 'dict_items'>
程序输出结果
<class 'dict_keys'>
<class 'dict_values'>
<class 'dict_items'>
看源码注释,解释的非常清楚:
keys
方法返回的是一个类集合的对象,是字典所有key
的一个视图;values
方法返回的是字典所有value
的视图;items
方法返回的是字典所有键值对的视图。
如何理解视图的概念
python2中 keys
方法返回的是列表,实实在在的数据,而python3中返回的是一个类集合的,
字典所有 key
的视图。在 mysql
里,视图表并不真正存储数据,但透过视图表,
可以看到真实的数据,视图表将若干个真实存储数据的表里的数据整合模拟出一张只读的表。
keys
方法返回的正是这样一个对象,它并不真正存储字典的 key
,
但通过 dict_keys
对象,可以访问字典的 key
。
print('小明' in keys)
for key in keys:
print(key)
True 小明 小红
上面的两个操作都是可行的,但不能对它进行任何的修改, 因为字典的视图对象都是只读的。
keys = stu_dict.keys()
stu_dict['小刚'] = 15
print(keys)
dict_keys(['小明', '小红', '小刚'])
from types import GeneratorType
print(isinstance(keys, GeneratorType))
False
print(isinstance(values, GeneratorType))
False
print(isinstance(items, GeneratorType))
False
能对其进行遍历,那起码得是可迭代对象。
from collections.abc import Iterable
print(isinstance(keys, Iterable))
True
print(isinstance(values, Iterable))
True
print(isinstance(items, Iterable))
True
from types import MappingProxyType
map_dict = MappingProxyType(stu_dict)
print(map_dict)
{'小明': 14, '小红': 13, '小刚': 15}
会报错:
# map_dict['小红'] = 14 #此代码会报错
使用 types
模块的 MappingProxyType
,可以创建整个字典的视图,
对这个视图的所有读操作都是支持的,但任何尝试修改的操作都将引发错误。
如果需要在设计程序时确保一个字典不被修改,那么可以考虑使用字典的视图对象,
任何人拿到一个字典的视图,都无法修改它。
需要注意一点,字典的视图不能修改,但修改原字典后, 字典的视图也等同于被修改,要想清楚一点,视图只是字典数据的只读的代理而已。