深入理解Python中字典的键的使用
作者:一路向北 发布时间:2021-05-31 09:29:03
字典的键
字典中的值没有任何限制, 可以是任意Python对象,即从标准对象到用户自定义对象皆可,但是字典中的键是有类型限制的。
(1)不允许一个键对应多个值
必须明确一条原则:每个键只能对应一个项。也就是说:一键对应多个值是不允许的(像列表、元组和其他字典这样的容器对象是可以的)。 当有键发生冲突(即字典键重复赋值),取最后(最近)的赋值。Python并不会因字典中的键存在冲突而产生一个错误,它不会检查键的冲突是因为如果真这样做的话,在每个键-值对赋值的时候都会做检查,这将会占用一定量的内存。
>>> dict1 = {'foo':789, 'foo': 'xyz'}
>>> dict1
{'foo': 'xyz'}
>>> dict1['foo'] = 123
>>> dict1
{'foo': 123}
(2)键必须是可哈希的
大多数Python对象可以作为键,但它们必须是可哈希的对象。像列表和字典这样的可变类型,由于它们不是可哈希的,所以不能作为键。
所有不可变的类型都是可哈希的,因此它们都可以做为字典的键。要说明的是:值相等的数字表示相同的键,即整型数字1和浮点数1.0的哈希值是相同的,它们是相同的键。
同时,也有一些可变对象(很少)是可哈希的,它们可以做字典的键,但很少见。举一个例子,一个实现了__hash__() 特殊方法的类。因为__hash__()方法返回一个整数,所以仍然是用不可变的值(做字典的键)。
为什么键必须是可哈希的?解释器调用哈希函数,根据字典中键的值来计算存储你的数据的位置。如果键是可变对象,它的值可改变。如果键发生变化,哈希函数会映射到不同的地址来存储数据。如果这样的情况发生,哈希函数就不可能可靠地存储或获取相关的数据。选择可哈希的键的原因就是因为它们的值不能改变。
数字和字符串可以被用做字典的键,元组是不可变的但也可能不是一成不变的,因此用元组做有效的键必须要加限制:若元
组中只包括像数字和字符串这样的不可变参数,才可以作为字典中有效的键。
示例:
# vi userpw.py
#!/usr/bin/env python
db = {}
def newuser():
prompt= 'please regist your name: '
while True:
name = raw_input(prompt)
if db.has_key(name):
prompt = 'name taken,try another: '
continue
else:
break
pwd = raw_input('passswd: ')
db[name] = pwd
print 'Newuser [%s] has added successfully!' %name
def olduser():
name = raw_input('login: ')
pwd = raw_input('passwd: ')
passwd = db.get(name)
if passwd == pwd:
print 'welcome back',name
else:
print 'login incorrect!'
def showmenu():
prompt = """
(N)ew User Login
(E)xisting User Login
(Q)uit
Enter choice: """
while True:
try:
choice = raw_input(prompt).strip()[0].lower()
print '\nYou picked: [%s]' % choice
if choice not in 'neq':
print 'invalid option,please try again'
if choice == 'n':
newuser()
if choice == 'e':
olduser()
if choice == 'q':
break
except(EOFError,KeyboardInterrupt):
print 'invalid option,please try again'
if __name__ == '__main__':
showmenu()


猜你喜欢
- 一、前言 说实话,刚测试ES的时候,我的内心是崩溃的,好多单词都不知道
- 本文实例讲述了Python实现的十进制小数与二进制小数相互转换功能。分享给大家供大家参考,具体如下:十进制小数 ⇒ 二进制小数乘2取整对十进
- CreateOrUpdate 是业务开发中很常见的场景,我们支持用户对某个业务实体进行创建/配置。希望实现的 repository 接口要达
- 相信用过Gmail的人都知道Gmail有一个草稿自动保存的功能,每过一段时间,Gmail都会自动保存邮件草稿,这样在一些突 * 况下就能快速地
- 1.函数的声明定义//func关键字//getStudent函数名//(id int, classId int) 参数列表//(name s
- 代码使用方法:0001:判断一个计算结果是不是无穷大:if(isFinite(999999999*999999999) == true)--
- <P><html><head><meta http-equiv="Content-Typ
- 索引下推(index condition pushdown )简称ICP,在Mysql5.6的版本上推出,用于优化查询。在不使用ICP的情况
- 一个小的解决方法分享:正常安装的情况下,你所需要的包都能在python文件夹下找到,找到你所需要的包 ,把它复制到Python35\Lib\
- 看了网站LOGO设计规范的思考的第一部分关于logo设计基础,现在接着来谈谈网络LOGO的设计。四、网络LOGO的设计 古代皇家的纹章,有条
- <%@ transaction = required %><%response.b
- 炫酷地图前期我们介绍了很多的地图模板,不管是全球的还是中国的,其实我感觉都十分的炫酷,哈哈哈,可是还有更加神奇的,更加炫酷的地图模板,下面让
- 使用Access数据库生成申报数据与读入数据的实例方法:示例:Sub Mwrite()On Error GoTo thiserrDim rs
- 性能不理想的系统中除了一部分是因为应用程序的负载确实超过了服务器的实际处理能力外,更多的是因为系统存在大量的SQL语句需要优化。为了获得稳定
- 图的定义图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E
- 前言Modbus协议是由Modicon公司(现在的施耐德电气Schneider Electric)推出,主要建立在物理串口、以太网TCP/I
- 今天写了个小功能,看起来挺简单,写的过程中发现了些坑。1.div没有disabled的属性,所以得写成button2.disabled在da
- pip是什么其实,pip就是 Python标准库(The Python Standard Library)中的一个包,这个包比较特殊,用它可
- 本文实例总结了python获取外网ip地址的方法。分享给大家供大家参考。具体如下:一、利用脚本引擎库直接获取import console;i
- 前言有时会遇到没有遵守第一范式设计模式的业务表。即一列中存储了多个属性值。如下表pkvalue1ET,AT2AT,BT3AT,DT4DT,C