深入理解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开发环境PyScripter中文乱码问题解决方案
Sep 11 Python
Python使用asyncio包处理并发详解
Sep 09 Python
django实现登录时候输入密码错误5次锁定用户十分钟
Nov 05 Python
Python 函数基础知识汇总
Mar 09 Python
Python实现的个人所得税计算器示例
Jun 01 Python
django框架使用orm实现批量更新数据的方法
Jun 21 Python
Python实现EXCEL表格的排序功能示例
Jun 25 Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
Aug 12 Python
python动态视频下载器的实现方法
Sep 16 Python
Python autoescape标签用法解析
Jan 17 Python
TensorFlow tensor的拼接实例
Jan 19 Python
在Tensorflow中查看权重的实现
Jan 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
MYSQL数据库初学者使用指南
2006/11/16 PHP
基于PHP中的常用函数回顾
2013/07/11 PHP
探寻PHP脚本不报错的原因
2014/06/12 PHP
PHP 生成N个不重复的随机数
2015/01/21 PHP
PHP array_reduce()函数的应用解析
2018/10/28 PHP
JavaScript小技巧 2.5 则
2010/09/12 Javascript
js使下拉列表框可编辑不止是选择
2013/12/12 Javascript
减少访问DOM的次数提升javascript性能
2014/02/24 Javascript
jquery控制显示服务器生成的图片流
2015/08/04 Javascript
jquery实现表单输入时提示文字滑动向上效果
2015/08/10 Javascript
js+canvas绘制矩形的方法
2016/01/28 Javascript
Angular4项目中添加i18n国际化插件ngx-translate的步骤详解
2017/07/02 Javascript
Vue.js图片预览插件使用详解
2018/08/27 Javascript
JavaScript基础之静态方法和实例方法分析
2018/12/26 Javascript
使用express来代理服务的方法
2019/06/21 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
layui table 表格上添加日期控件的两种方法
2019/09/28 Javascript
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
Django框架下在视图中使用模版的方法
2015/07/16 Python
Python爬虫抓取手机APP的传输数据
2016/01/22 Python
Python读写docx文件的方法
2018/05/08 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
flask框架路由常用定义方式总结
2019/07/23 Python
结合OpenCV与TensorFlow进行人脸识别的实现
2019/10/10 Python
python判断变量是否为列表的方法
2020/09/17 Python
英国最大的独立玩具专卖店:The Entertainer
2019/09/06 全球购物
Java Servlet的主要功能和作用是什么
2014/02/14 面试题
自我评价中英文语句
2013/11/30 职场文书
《四季》教学反思
2014/04/08 职场文书
委托书怎样写
2014/08/30 职场文书
2014年学习厉行节约反对浪费思想汇报
2014/09/10 职场文书
中国世界遗产导游词
2015/02/13 职场文书
总经理致辞
2015/07/29 职场文书
详解gantt甘特图可拖拽、编辑(vue、react都可用 highcharts)
2021/11/27 Vue.js
一篇文章了解正则表达式的替换技巧
2022/02/24 Javascript