深入理解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访问纯真IP数据库的代码
May 19 Python
python编写简单爬虫资料汇总
Mar 22 Python
Python算法应用实战之队列详解
Feb 04 Python
python生成excel的实例代码
Nov 08 Python
Django进阶之CSRF的解决
Aug 01 Python
在Python中pandas.DataFrame重置索引名称的实例
Nov 06 Python
Django数据库类库MySQLdb使用详解
Apr 28 Python
Apache,wsgi,django 程序部署配置方法详解
Jul 01 Python
使用matplotlib绘制图例标签中带有公式的图
Dec 13 Python
Python Scrapy多页数据爬取实现过程解析
Jun 12 Python
Python类的继承super相关原理解析
Oct 22 Python
python中doctest库实例用法
Dec 31 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学习之输出字符串(echo,print,printf,print_r和var_dump)
2011/04/17 PHP
深入分析php之面向对象
2013/05/15 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
2016/09/23 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
浅谈PHP array_search 和 in_array 函数效率问题
2019/10/15 PHP
JavaScript For Beginners(转载)
2007/01/05 Javascript
javascript中的对象和数组的应用技巧
2007/01/07 Javascript
javascript实现英文首字母大写
2015/04/23 Javascript
jQuery实现简单的文件上传进度条效果
2020/03/26 Javascript
jq checkbox 的全选并ajax传参的实例
2017/04/01 Javascript
jQuery模拟实现天猫购物车动画效果实例代码
2017/05/25 jQuery
React中上传图片到七牛的示例代码
2017/10/10 Javascript
推荐10款扩展Web表单的JS插件
2017/12/25 Javascript
解决vue路由后界面没有变化,但是链接有的问题
2018/09/01 Javascript
nodejs aes 加解密实例
2018/10/10 NodeJs
node.js制作一个简单的登录拦截器
2020/02/10 Javascript
[01:39](回顾)各路豪强针锋相对,几经鏖战四强产生
2014/07/01 DOTA
[02:39]我与DAC之Newbee.Moogy:从论坛到TI
2018/03/26 DOTA
python操作日期和时间的方法
2014/03/11 Python
Python遍历指定文件及文件夹的方法
2015/05/09 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
Python中的descriptor描述器简明使用指南
2016/06/02 Python
Python RabbitMQ消息队列实现rpc
2018/05/30 Python
pandas Dataframe行列读取的实例
2018/06/08 Python
树莓派使用USB摄像头和motion实现监控
2019/06/22 Python
python匿名函数的使用方法解析
2019/10/10 Python
Python实现Wordcloud生成词云图的示例
2020/03/30 Python
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
Sandro法国官网:法国成衣品牌
2019/08/28 全球购物
StringBuilder和String的区别
2015/05/18 面试题
棉花姑娘教学反思
2014/02/15 职场文书
小学生学习感言
2014/03/10 职场文书
公司备用金管理制度
2015/08/04 职场文书
清明扫墓感想
2015/08/11 职场文书
python 判断字符串当中是否包含字符(str.contain)
2022/06/01 Python