深入理解Python中字典的键的使用


Posted in Python onAugust 19, 2015

字典的键

       字典中的值没有任何限制, 可以是任意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()
Python 相关文章推荐
python获得一个月有多少天的方法
Jun 04 Python
python操作字典类型的常用方法(推荐)
May 16 Python
Python 3.x 连接数据库示例(pymysql 方式)
Jan 19 Python
python实现数据库跨服务器迁移
Apr 12 Python
Python操作word常见方法示例【win32com与docx模块】
Jul 17 Python
pandas通过索引进行排序的示例
Nov 16 Python
python解析含有重复key的json方法
Jan 22 Python
python自动发送测试报告邮件功能的实现
Jan 22 Python
python中如何使用insert函数
Jan 09 Python
python是怎么被发明的
Jun 15 Python
Python hashlib和hmac模块使用方法解析
Dec 08 Python
pandas取dataframe特定行列的实现方法
May 24 Python
详解Python中映射类型的内建函数和工厂函数
Aug 19 #Python
详解Python中映射类型(字典)操作符的概念和使用
Aug 19 #Python
Python中字典的基础知识归纳小结
Aug 19 #Python
Python在Windows和在Linux下调用动态链接库的教程
Aug 18 #Python
Python中map,reduce,filter和sorted函数的使用方法
Aug 17 #Python
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
Aug 16 #Python
使用Python操作MySQL的一些基本方法
Aug 16 #Python
You might like
怎样才能成为PHP高手?学会“懒惰”的编程
2006/12/05 PHP
浅析Yii2缓存的使用
2016/05/10 PHP
php实现文件与16进制相互转换的方法示例
2017/02/16 PHP
php数据序列化测试实例详解
2017/08/12 PHP
PHP递归统计系统中代码行数
2019/09/19 PHP
BOM与DOM的区别分析
2010/10/26 Javascript
HTML Color Picker(js拾色器效果)
2013/08/27 Javascript
javascript实现dom动态创建省市纵向列表菜单的方法
2015/05/14 Javascript
JavaScript字符串常用的方法
2016/03/10 Javascript
JavaScript几种数组去掉重复值的方法推荐
2016/04/12 Javascript
巧用jQuery选择器提高写表单效率的方法
2016/08/19 Javascript
微信小程序 数据访问实例详解
2016/10/08 Javascript
jquery中用函数来设置css样式
2016/12/22 Javascript
jquery uploadify如何取消已上传成功文件
2017/02/08 Javascript
详解Vue生命周期的示例
2017/03/10 Javascript
npm国内镜像 安装失败的几种解决方案
2017/06/04 Javascript
JavaScript正则表达式简单实用实例
2017/06/23 Javascript
使用JavaScript实现链表的数据结构的代码
2017/08/02 Javascript
nodejs实现超简单生成二维码的方法
2018/03/17 NodeJs
JavaScript解决浮点数计算不准确问题的方法分析
2018/07/09 Javascript
深入理解vue中的slot与slot-scope
2019/04/22 Javascript
webpack4.0+vue2.0利用批处理生成前端单页或多页应用的方法
2019/06/28 Javascript
jQuery实现倒计时功能完整示例
2020/06/01 jQuery
[54:58]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第一场 11.25
2020/11/25 DOTA
Python生成pdf文件的方法
2014/08/04 Python
python连接MySQL数据库实例分析
2015/05/12 Python
Django项目中用JS实现加载子页面并传值的方法
2018/05/28 Python
python opencv实现运动检测
2018/07/10 Python
python读取有密码的zip压缩文件实例
2019/02/08 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
英国一家专门出售品牌鞋子的网站:Allsole
2016/08/07 全球购物
正规的求职信范文分享
2013/12/11 职场文书
门卫人员岗位职责
2013/12/24 职场文书
2015年入党决心书
2015/02/05 职场文书
《我们的民族小学》教学反思
2016/02/19 职场文书
创业计划书之餐饮
2019/09/02 职场文书