深入理解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 version 2.7 required, which was not found in the registry
Aug 26 Python
python写xml文件的操作实例
Oct 05 Python
Python制作简单的网页爬虫
Nov 22 Python
Python使用filetype精确判断文件类型
Jul 02 Python
Python实现的简单模板引擎功能示例
Sep 02 Python
opencv python 2D直方图的示例代码
Jul 20 Python
pandas每次多Sheet写入文件的方法
Dec 10 Python
为什么你还不懂得怎么使用Python协程
May 13 Python
python批量解压zip文件的方法
Aug 20 Python
Python利用PyPDF2库获取PDF文件总页码实例
Apr 03 Python
python属于软件吗
Jun 18 Python
解决selenium+Headless Chrome实现不弹出浏览器自动化登录的问题
Jan 09 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
咖啡知识大全
2021/03/03 新手入门
初探PHP5
2006/10/09 PHP
一个简单的php实现的MySQL数据浏览器
2007/03/11 PHP
WordPress判断用户是否登录的代码
2011/03/17 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
Ext面向对象开发实践(续)
2008/11/18 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
完美解决IE不支持Data.parse()的问题
2016/11/24 Javascript
footer定位页面底部(代码分享)
2017/03/07 Javascript
详解VueJs前后端分离跨域问题
2017/05/24 Javascript
JQuery EasyUI 结合ztrIee的后台页面开发实例
2017/09/01 jQuery
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
2018/01/16 Javascript
详解vue组件开发脚手架
2018/06/15 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
Angular5中状态管理的实现
2018/09/03 Javascript
微信小程序中悬浮窗功能的实现代码
2019/08/02 Javascript
Vue Router中应用中间件的方法
2020/08/06 Javascript
python中使用OpenCV进行人脸检测的例子
2014/04/18 Python
跟老齐学Python之使用Python查询更新数据库
2014/11/25 Python
python使用参数对嵌套字典进行取值的方法
2019/04/26 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
详解Python 字符串相似性的几种度量方法
2019/08/29 Python
python中通过selenium简单操作及元素定位知识点总结
2019/09/10 Python
Python写出新冠状病毒确诊人数地图的方法
2020/02/12 Python
Python函数__new__及__init__作用及区别解析
2020/08/31 Python
什么是属性访问器
2015/10/26 面试题
构造方法和其他方法的区别
2016/04/26 面试题
酒吧员工的岗位职责
2013/11/26 职场文书
一夜的工作教学反思
2014/02/08 职场文书
数控专业毕业生自荐信范文
2014/03/04 职场文书
珍惜资源保护环境的建议书
2014/05/14 职场文书
党支部三会一课计划
2014/09/24 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
大学生思想道德自我评价
2015/03/09 职场文书