深入理解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 11 Python
python+tkinter编写电脑桌面放大镜程序实例代码
Jan 16 Python
python使用pycharm环境调用opencv库
Feb 11 Python
Python smtplib实现发送邮件功能
May 22 Python
python全栈知识点总结
Jul 01 Python
python实现文件的分割与合并
Aug 29 Python
Python values()与itervalues()的用法详解
Nov 27 Python
基于python实现文件加密功能
Jan 06 Python
Python3 字典dictionary入门基础附实例
Feb 10 Python
keras中的loss、optimizer、metrics用法
Jun 15 Python
Python接口自动化测试的实现
Aug 28 Python
python实现启动一个外部程序,并且不阻塞当前进程
Dec 05 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 移除数组重复元素的一点说明
2008/11/27 PHP
php UBB 解析实现代码
2011/11/27 PHP
使用PHP编写发红包程序
2015/07/22 PHP
详解WordPress中分类函数wp_list_categories的使用
2016/01/04 PHP
ThinkPHP静态缓存简单配置和使用方法详解
2016/03/23 PHP
php pdo操作数据库示例
2017/03/10 PHP
js动态拼接正则表达式的两种方法
2014/03/04 Javascript
JS实现左右无缝轮播图代码
2016/05/01 Javascript
AngularJS自定义服务与fliter的混合使用
2016/11/24 Javascript
JavaScript浏览器对象模型BOM(BrowserObjectModel)实例详解
2016/11/29 Javascript
Vue监听数据对象变化源码
2017/03/09 Javascript
jQuery实现Select下拉列表进行状态选择功能
2017/03/30 jQuery
js实现分页功能
2017/05/24 Javascript
vue在使用ECharts时的异步更新和数据加载详解
2017/11/22 Javascript
使用D3.js创建物流地图的示例代码
2018/01/27 Javascript
使用electron制作满屏心特效的示例代码
2018/11/27 Javascript
vue+element-ui+axios实现图片上传
2019/08/20 Javascript
Vue filter 过滤当前时间 实现实时更新效果
2019/12/20 Javascript
JavaScript中arguments的使用方法详解
2020/12/20 Javascript
Python实现文件复制删除
2016/04/19 Python
Centos 升级到python3后pip 无法使用的解决方法
2018/06/12 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
python+openCV调用摄像头拍摄和处理图片的实现
2019/08/06 Python
pytest中文文档之编写断言
2019/09/12 Python
Django文件上传与下载(FileFlid)
2019/10/06 Python
Pytorch上下采样函数--interpolate用法
2020/07/07 Python
CSS3制作酷炫的三维相册效果
2016/07/01 HTML / CSS
如何写出高性能的JSP和Servlet
2013/01/22 面试题
C语言编程题
2015/03/09 面试题
简历中自我评价范文3则
2013/12/14 职场文书
法警的竞聘演讲稿
2014/01/02 职场文书
优秀学生干部个人事迹材料
2014/06/02 职场文书
画展观后感
2015/06/17 职场文书
律师催款函范文
2015/06/24 职场文书
初中物理教学反思
2016/02/19 职场文书