深入理解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发送邮件示例(支持中文邮件标题)
Feb 16 Python
Python循环语句中else的用法总结
Sep 11 Python
对python中return和print的一些理解
Aug 18 Python
go和python变量赋值遇到的一个问题
Aug 31 Python
利用Python进行异常值分析实例代码
Dec 07 Python
Python实现自动上京东抢手机
Feb 06 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
Apr 20 Python
Python绘制KS曲线的实现方法
Aug 13 Python
Django 登陆验证码和中间件的实现
Aug 17 Python
利用python-pypcap抓取带VLAN标签的数据包方法
Jul 23 Python
Python3爬虫中pyspider的安装步骤
Jul 29 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
便携利器 — TECSUN PL-365简评
2021/03/02 无线电
Php中文件下载功能实现超详细流程分析
2012/06/13 PHP
php中让上传的文件大小在上传前就受限制的两种解决方法
2013/06/24 PHP
php 删除cookie方法详解
2014/12/01 PHP
php面试实现反射注入的详细方法
2019/09/30 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
在js中单选框和复选框获取值的方式
2009/11/06 Javascript
ExtJS的FieldSet的column列布局
2009/11/20 Javascript
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
javascript 全选与全取消功能的实现代码
2012/12/23 Javascript
jQuery布局插件UI Layout简介及使用方法
2013/04/03 Javascript
jQuery判断checkbox是否选中的小例子
2013/12/02 Javascript
js的Boolean对象初始值示例
2014/03/04 Javascript
JavaScript设计模式之建造者模式介绍
2014/12/28 Javascript
JS在Chrome浏览器中showModalDialog函数返回值为undefined的解决方法
2016/08/03 Javascript
javascript 秒表计时器实现代码
2017/03/09 Javascript
BootStrap的双日历时间控件使用
2017/07/25 Javascript
微信小程序自定义头部导航栏(组件化)
2019/11/15 Javascript
nodejs开发一个最简单的web服务器实例讲解
2020/01/02 NodeJs
python动态监控日志内容的示例
2014/02/16 Python
Python实现二分查找算法实例
2015/05/26 Python
一张图带我们入门Python基础教程
2017/02/05 Python
python中的随机函数小结
2018/01/27 Python
Selenium鼠标与键盘事件常用操作方法示例
2018/08/13 Python
Python小程序 控制鼠标循环点击代码实例
2019/10/08 Python
python利用JMeter测试Tornado的多线程
2020/01/12 Python
解决TensorFlow训练内存不断增长,进程被杀死问题
2020/02/05 Python
美国温暖商店:The Warming Store
2018/12/15 全球购物
阿迪达斯英国官方网站:adidas英国
2019/08/13 全球购物
Brasty罗马尼亚:购买手表、香水、化妆品、珠宝
2020/04/21 全球购物
如果重写了对象的equals()方法,需要考虑什么
2014/11/02 面试题
2014年创卫实施方案
2014/02/18 职场文书
会计核算科岗位职责
2014/03/19 职场文书
学生手册评语
2014/05/05 职场文书
员工评语范文
2014/12/31 职场文书
原生JS实现飞机大战小游戏
2021/06/09 Javascript