深入理解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 smallseg分词用法实例分析
May 28 Python
python实现简单socket通信的方法
Apr 19 Python
Python的Flask框架标配模板引擎Jinja2的使用教程
Jul 12 Python
Python编程之黑板上排列组合,你舍得解开吗
Oct 30 Python
caffe binaryproto 与 npy相互转换的实例讲解
Jul 09 Python
利用python在excel里面直接使用sql函数的方法
Feb 08 Python
Python基础之条件控制操作示例【if语句】
Mar 23 Python
django-利用session机制实现唯一登录的例子
Mar 16 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
Jun 04 Python
如何导出python安装的所有模块名称和版本号到文件中
Jun 05 Python
Django如何实现密码错误报错提醒
Sep 04 Python
如何设置PyCharm中的Python代码模版(推荐)
Nov 20 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/10/09 PHP
PHP使用PDO操作数据库的乱码问题解决方法
2016/04/08 PHP
jquery ajax提交表单数据的两种方式
2009/11/24 Javascript
js 变量类型转换常用函数与代码[比较全]
2009/12/01 Javascript
javascript之通用简单的table选项卡实现(二)
2010/05/09 Javascript
读jQuery之十三 添加事件和删除事件的核心方法
2011/08/23 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
用js将内容复制到剪贴板兼容浏览器
2014/03/18 Javascript
详解JavaScript中的异常处理方法
2015/06/16 Javascript
JavaScript数据类型学习笔记
2016/01/25 Javascript
nodejs基础知识
2017/02/03 NodeJs
ejsExcel模板在Vue.js项目中的实际运用
2018/01/27 Javascript
vue axios请求超时的正确处理方法
2018/04/02 Javascript
使用vuex的state状态对象的5种方式
2018/04/19 Javascript
python函数式编程学习之yield表达式形式详解
2018/03/25 Python
完美解决安装完tensorflow后pip无法使用的问题
2018/06/11 Python
对Python之gzip文件读写的方法详解
2019/02/08 Python
python交易记录整合交易类详解
2019/07/03 Python
python 叠加等边三角形的绘制的实现
2019/08/14 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
django-crontab实现服务端的定时任务的示例代码
2020/02/17 Python
Python爬取数据并实现可视化代码解析
2020/08/12 Python
英国排名第一的最新设计师品牌手表独立零售商:TIC Watches
2016/09/24 全球购物
微软日本官方网站:Microsoft日本
2017/11/26 全球购物
大学生标准自荐书
2014/06/15 职场文书
护士找工作求职信
2014/07/02 职场文书
行风评议整改报告
2014/11/06 职场文书
员工辞职信怎么写
2015/02/27 职场文书
大二学年个人总结
2015/03/03 职场文书
初婚未育证明样本
2015/06/18 职场文书
广告策划的实习心得体会总结!
2019/07/22 职场文书
一文搞懂如何实现Go 超时控制
2021/03/30 Python
nginx前后端同域名配置的方法实现
2021/03/31 Servers
Pytorch 使用tensor特定条件判断索引
2021/04/08 Python
Redis特殊数据类型HyperLogLog基数统计算法讲解
2022/06/01 Redis