深入理解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全局变量操作详解
Apr 14 Python
Python浅复制中对象生存周期实例分析
Apr 02 Python
Python类的继承、多态及获取对象信息操作详解
Feb 28 Python
Python字符串的常见操作实例小结
Apr 08 Python
Python实现将HTML转成PDF的方法分析
May 04 Python
python从list列表中选出一个数和其对应的坐标方法
Jul 20 Python
python对常见数据类型的遍历解析
Aug 27 Python
Python异常继承关系和自定义异常实现代码实例
Feb 20 Python
pandas中read_csv、rolling、expanding用法详解
Apr 21 Python
Python JSON常用编解码方法代码实例
Sep 05 Python
Python爬虫分析微博热搜关键词的实现代码
Feb 22 Python
Python matplotlib可视化之绘制韦恩图
Feb 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
C# Assembly类访问程序集信息
2009/06/13 PHP
PHP中利用substr_replace将指定两位置之间的字符替换为*号
2011/01/27 PHP
10个超级有用的PHP代码片段果断收藏
2015/09/23 PHP
php文件上传你必须知道的几点
2015/10/20 PHP
PHP实现的简单异常处理类示例
2017/05/04 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
2019/05/05 PHP
Laravel5.1 框架控制器基础用法实例分析
2020/01/04 PHP
JQUERY 对象与DOM对象之两者相互间的转换
2009/04/27 Javascript
js里取容器大小、定位、距离等属性搜集整理
2013/08/19 Javascript
jquery css 设置table的奇偶行背景色示例
2014/06/03 Javascript
js实现在网页上简单显示时间的方法
2015/03/02 Javascript
jquery专业的导航菜单特效代码分享
2015/08/29 Javascript
JavaScript数组去重的五种方法
2015/11/05 Javascript
学习Node.js模块机制
2016/10/17 Javascript
jQuery Easy UI中根据第一个下拉框选中的值设置第二个下拉框是否可以编辑
2016/11/29 Javascript
JavaScript常见的五种数组去重的方式
2016/12/15 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
iframe高度自适应及隐藏滚动条的实例详解
2017/09/29 Javascript
jQuery常见的遍历DOM操作详解
2018/09/05 jQuery
vue日历/日程提醒/html5本地缓存功能
2019/09/02 Javascript
vue语法自动转typescript(解放双手)
2019/09/18 Javascript
创建与框架无关的JavaScript插件
2020/12/01 Javascript
Python常用算法学习基础教程
2017/04/13 Python
django+js+ajax实现刷新页面的方法
2017/05/22 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
详解django使用include无法跳转的解决方法
2020/03/19 Python
keras多显卡训练方式
2020/06/10 Python
用opencv给图片换背景色的示例代码
2020/07/08 Python
2021年值得向Python开发者推荐的VS Code扩展插件
2021/01/25 Python
html5实现微信打飞机游戏
2014/03/27 HTML / CSS
美国大型的健身社区和补充商店:Bodybuilding.com
2016/09/06 全球购物
人事主管岗位职责
2015/02/04 职场文书
呐喊读书笔记
2015/06/30 职场文书
政协常委会议主持词
2015/07/03 职场文书
Python 装饰器(decorator)常用的创建方式及解析
2022/04/24 Python
向Spring IOC 容器动态注册bean实现方式
2022/07/15 Java/Android