深入理解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中while true的使用
Oct 13 Python
获取Django项目的全部url方法详解
Oct 26 Python
Python中列表与元组的乘法操作示例
Feb 10 Python
在python plt图表中文字大小调节的方法
Jul 08 Python
python pandas获取csv指定行 列的操作方法
Jul 12 Python
pygame实现俄罗斯方块游戏(基础篇3)
Oct 29 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
Apr 30 Python
python xlsxwriter模块的使用
Dec 24 Python
python实现网络五子棋
Apr 11 Python
Python实现滑雪小游戏
Sep 25 Python
python基础之文件操作
Oct 24 Python
Pytorch中使用ImageFolder读取数据集时忽略特定文件
Mar 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
php一次性删除前台checkbox多选内容的方法
2013/09/22 PHP
Javascript与PHP验证用户输入URL地址是否正确
2014/10/09 PHP
thinkPHP中分页用法实例分析
2015/12/26 PHP
JSON字符串传到后台PHP处理问题的解决方法
2016/06/05 PHP
laravel 5.3 单用户登录简单实现方法
2019/10/14 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
jquery入门必备的基本认识及实例(整理)
2013/06/24 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
2014/02/12 Javascript
JavaScript获取当前页面上的指定对象示例代码
2014/02/28 Javascript
浅谈javascript中的闭包
2015/05/13 Javascript
Node.js原生api搭建web服务器的方法步骤
2019/02/15 Javascript
微信小程序实现发送模板消息功能示例【通过openid推送消息给用户】
2019/05/05 Javascript
JavaScript使用localStorage存储数据
2019/09/25 Javascript
javascript 对象 与 prototype 原型用法实例分析
2019/11/11 Javascript
在js文件中引入(调用)另一个js文件的三种方法
2020/09/11 Javascript
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
2020/12/15 Vue.js
[01:29]2014DOTA2展望TI 剑指西雅图DK战队专访
2014/06/30 DOTA
[05:09]DOTA2-DPC中国联赛2月22日Recap集锦
2021/03/11 DOTA
python中lambda函数 list comprehension 和 zip函数使用指南
2014/09/28 Python
python实现将读入的多维list转为一维list的方法
2018/06/28 Python
总结python中pass的作用
2019/02/27 Python
Django自定义用户登录认证示例代码
2019/06/30 Python
Python下利用BeautifulSoup解析HTML的实现
2020/01/17 Python
django有外键关系的两张表如何相互查找
2020/02/10 Python
Python如何输出整数
2020/06/07 Python
利用css3画个同心圆示例代码
2017/07/03 HTML / CSS
css3实现文字首尾衔接跑马灯的示例代码
2020/10/16 HTML / CSS
马来西亚最大的电器网站:Senheng
2017/10/13 全球购物
Ralph Lauren拉夫·劳伦美国官网:带有浓郁美国气息的高品味时装品牌
2017/11/01 全球购物
美国背景检查、公共记录和人物搜索网站:BeenVerified
2018/02/25 全球购物
Strawberrynet草莓网新加坡站:护肤、彩妆、香水及美发产品
2018/08/31 全球购物
小学先进集体事迹材料
2014/05/31 职场文书
农村婚礼司仪主持词
2015/06/29 职场文书
关于实现中国梦的心得体会
2016/01/05 职场文书
Python自动化爬取天眼查数据的实现
2021/06/15 Python
HTML中的表格元素介绍
2022/02/28 HTML / CSS