深入理解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脚本生成Android SALT扰码的方法
Sep 18 Python
linux系统使用python获取内存使用信息脚本分享
Jan 15 Python
深入理解python try异常处理机制
Jun 01 Python
使用python实现knn算法
Dec 20 Python
pandas 透视表中文字段排序方法
Nov 16 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
Feb 17 Python
python挖矿算力测试程序详解
Jul 03 Python
python django中8000端口被占用的解决
Dec 17 Python
python 爬取马蜂窝景点翻页文字评论的实现
Jan 20 Python
python 弧度与角度互转实例
Apr 15 Python
python怎么判断素数
Jul 01 Python
教你怎么用PyCharm为同一服务器配置多个python解释器
May 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中file_get_content 和curl以及fopen 效率分析
2014/09/19 PHP
PHP用户管理中常用接口调用实例及解析(含源码)
2017/03/09 PHP
两个JavaScript jsFiddle JSBin在线调试器
2010/03/14 Javascript
jquery $.ajax相关用法分享
2012/03/16 Javascript
jquery操作下拉列表、文本框、复选框、单选框集合(收藏)
2014/01/08 Javascript
jQuery结合CSS制作漂亮的select下拉菜单
2015/05/03 Javascript
Nodejs高扩展性的模板引擎 functmpl简介
2017/02/13 NodeJs
JavaScript实现QQ列表展开收缩扩展功能
2017/10/30 Javascript
Vue通过URL传参如何控制全局console.log的开关详解
2017/12/07 Javascript
对mac下nodejs 更新到最新版本的最新方法(推荐)
2018/05/17 NodeJs
30分钟快速实现小程序语音识别功能
2018/11/27 Javascript
Element-UI 使用el-row 分栏布局的教程
2020/10/26 Javascript
利用JS判断元素是否为数组的方法示例
2021/01/08 Javascript
[01:12:44]VG vs Mineski Supermajor 败者组 BO3 第二场 6.6
2018/06/07 DOTA
Python 文件操作实现代码
2009/10/07 Python
python快速排序代码实例
2013/11/21 Python
Flask框架的学习指南之用户登录管理
2016/11/20 Python
使用python实现tcp自动重连
2017/07/02 Python
pandas值替换方法
2018/07/10 Python
Python Learning 列表的更多操作及示例代码
2018/08/22 Python
Python解决两个整数相除只得到整数部分的实例
2018/11/10 Python
在PyCharm的 Terminal(终端)切换Python版本的方法
2019/08/02 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
使用 Python 写一个简易的抽奖程序
2019/12/08 Python
Python with标签使用方法解析
2020/01/17 Python
python读取文件指定行内容实例讲解
2020/03/02 Python
Python中SQLite如何使用
2020/05/27 Python
详解Python直接赋值,深拷贝和浅拷贝
2020/07/09 Python
高级护理实习生自荐信
2013/09/28 职场文书
《第一次抱母亲》教学反思
2014/04/16 职场文书
2014年检验员工作总结
2014/11/19 职场文书
求职信格式范文
2015/03/19 职场文书
JDBC连接的六步实例代码(与mysql连接)
2021/05/12 MySQL
MySQL优化之如何写出高质量sql语句
2021/05/17 MySQL
Html5同时支持多端sdk的小技巧
2021/11/17 HTML / CSS
一文了解MySQL二级索引的查询过程
2022/02/24 MySQL