深入理解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使用正则表达式分析网页中的图片并进行替换的方法
Mar 26 Python
python安装cx_Oracle模块常见问题与解决方法
Feb 21 Python
CentOS 7下安装Python 3.5并与Python2.7兼容并存详解
Jul 07 Python
Python中input与raw_input 之间的比较
Aug 20 Python
对python3 一组数值的归一化处理方法详解
Jul 11 Python
Python单元和文档测试实例详解
Apr 11 Python
Python中函数参数匹配模型详解
Jun 09 Python
python实现列表的排序方法分享
Jul 01 Python
关于tf.matmul() 和tf.multiply() 的区别说明
Jun 18 Python
Java爬虫技术框架之Heritrix框架详解
Jul 22 Python
一文读懂Python 枚举
Aug 25 Python
python rsa-oaep加密的示例代码
Sep 23 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中遍历stdclass object的实现代码
2011/06/09 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
php mysql实现mysql_select_db选择数据库
2016/12/30 PHP
PHP判断当前使用的是什么浏览器(推荐)
2019/10/27 PHP
Js获取事件对象代码
2010/08/05 Javascript
JS批量修改PS中图层名称的方法
2014/01/26 Javascript
javascript巧用eval函数组装表单输入项为json对象的方法
2015/11/25 Javascript
Bootstrap入门书籍之(三)栅格系统
2016/02/17 Javascript
jquery获取复选框的值的简单实例
2016/05/26 Javascript
Angular中ng-options下拉数据默认值的设定方法
2017/06/21 Javascript
nodejs超出最大的调用栈错误问题
2017/12/27 NodeJs
javascript中call,apply,callee,caller用法实例分析
2019/07/24 Javascript
vue实现配置全局访问路径头(axios)
2019/11/01 Javascript
[01:43]深扒TI7聊天轮盘语音出处4
2017/05/11 DOTA
Python编程中实现迭代器的一些技巧小结
2016/06/21 Python
通过5个知识点轻松搞定Python的作用域
2016/09/09 Python
Python的时间模块datetime详解
2017/04/17 Python
python爬虫爬取淘宝商品信息
2018/02/23 Python
CentOS 7 安装python3.7.1的方法及注意事项
2018/11/01 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
HTML5的video标签的浏览器兼容性增强方案分享
2016/05/19 HTML / CSS
HTML5 Canvas阴影使用方法实例演示
2013/08/02 HTML / CSS
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
加拿大休闲和工业服装和鞋类零售商:L’Équipeur
2018/01/12 全球购物
猫咪家具:CatsPlay
2018/11/03 全球购物
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
法院实习人员自我鉴定
2013/09/26 职场文书
实习教师自我鉴定
2013/09/27 职场文书
会计自我鉴定
2014/02/04 职场文书
经典婚礼主持开场白
2014/03/13 职场文书
文明村镇申报材料
2014/05/06 职场文书
商务经理岗位职责
2014/07/30 职场文书
党在我心中的演讲稿
2014/09/13 职场文书
2016大学先进团支部事迹材料
2016/03/01 职场文书
OpenCV全景图像拼接的实现示例
2021/06/05 Python
前端canvas中物体边框和控制点的实现示例
2022/08/05 Javascript