深入理解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实现Windows和Linux之间互相传输文件(文件夹)的方法
May 08 Python
python django使用haystack:全文检索的框架(实例讲解)
Sep 27 Python
浅析Python装饰器以及装饰器模式
May 28 Python
python利用跳板机ssh远程连接redis的方法
Feb 19 Python
python实现名片管理系统项目
Apr 26 Python
Django项目中实现使用qq第三方登录功能
Aug 13 Python
Python 使用type来定义类的实现
Nov 19 Python
python3 Scrapy爬虫框架ip代理配置的方法
Jan 17 Python
python opencv把一张图片嵌入(叠加)到另一张图片上的实现代码
Jun 11 Python
MoviePy简介及Python视频剪辑自动化
Dec 18 Python
python中使用asyncio实现异步IO实例分析
Feb 26 Python
Python常用配置文件ini、json、yaml读写总结
Jul 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
第十五节--Zend引擎的发展
2006/11/16 PHP
php对csv文件的读取,写入,输出下载操作详解
2013/08/10 PHP
10 个经典PHP函数
2013/10/17 PHP
教你如何快捷的使用cmd访问mysql小技巧
2014/05/26 PHP
php 购物车完整实现代码
2014/06/05 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
PHP实现bitmap位图排序与求交集的方法
2016/07/28 PHP
jQuery不间断滚动效果(模拟百度新闻支持文字/图片/垂直滚动)
2013/02/05 Javascript
jQuery快速上手:写jQuery与直接写JS的区别详细解析
2013/08/26 Javascript
Javascript和Java获取各种form表单信息的简单实例
2014/02/14 Javascript
JS对字符串编码的几种方式使用指南
2015/05/14 Javascript
jQuery控制li上下循环滚动插件用法实例(附demo源码下载)
2016/05/28 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
用js控件div的滚动条,让它在内容更新时自动滚到底部的实现方法
2016/10/27 Javascript
微信小程序 简单教程实例详解
2017/01/13 Javascript
jQuery实现动态生成表格并为行绑定单击变色动作的方法
2017/04/17 jQuery
d3.js入门教程之数据绑定详解
2017/04/28 Javascript
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
Python使用MONGODB入门实例
2015/05/11 Python
Pycharm 创建 Django admin 用户名和密码的实例
2018/05/30 Python
使用python的pyplot绘制函数实例
2020/02/13 Python
python实现图片横向和纵向拼接
2020/03/05 Python
解决pymysql cursor.fetchall() 获取不到数据的问题
2020/05/15 Python
树莓派升级python的具体步骤
2020/07/05 Python
IE支持HTML5的解决方法
2009/10/20 HTML / CSS
伦敦高级内衣品牌:Agent Provocateur(大内密探)
2016/08/23 全球购物
PHP笔试题
2012/02/22 面试题
什么是ARP(Address Resolution Protocol)地址解析协议
2013/10/31 面试题
Weblogic和WebSphere不同特点
2012/05/09 面试题
一套Delphi的笔试题二
2013/05/11 面试题
英文自荐信
2013/12/19 职场文书
大学生村官演讲稿
2014/04/25 职场文书
装饰公司活动策划方案
2014/08/23 职场文书
餐饮服务食品安全承诺书
2015/04/29 职场文书
情感电台广播稿
2015/08/18 职场文书
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS