深入理解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中sets模块的用法实例
Sep 30 Python
python实现每次处理一个字符的三种方法
Oct 09 Python
零基础写python爬虫之打包生成exe文件
Nov 06 Python
python使用Tkinter显示网络图片的方法
Apr 24 Python
django ajax json的实例代码
May 29 Python
Python获取命令实时输出-原样彩色输出并返回输出结果的示例
Jul 11 Python
如何使用python爬虫爬取要登陆的网站
Jul 12 Python
Selenium常见异常解析及解决方案示范
Apr 10 Python
Django QuerySet查询集原理及代码实例
Jun 13 Python
appium+python自动化配置(adk、jdk、node.js)
Nov 17 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
Feb 02 Python
pycharm Tab键设置成4个空格的操作
Feb 26 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 数据库字段复用的基本原理与示例
2011/07/22 PHP
php缓冲 output_buffering和ob_start使用介绍
2014/01/30 PHP
php之Smarty模板使用方法示例详解
2014/07/08 PHP
PHP实现Redis单据锁以及防止并发重复写入
2018/04/10 PHP
Laravel 在views中加载公共页面的实现代码
2019/10/22 PHP
JQUERY CHECKBOX全选,取消全选,反选方法三
2008/08/30 Javascript
jquery对表单操作2
2011/04/06 Javascript
jquery easyui combobox模糊过滤(示例代码)
2013/11/30 Javascript
IE下Ajax缓存问题的快速解决方法(get方式)
2014/01/09 Javascript
两个select多选模式的选项相互移动(示例代码)
2014/01/11 Javascript
javascript实现带下拉子菜单的导航菜单效果
2015/05/14 Javascript
JS实现带导航城市列表以及输入搜索功能
2018/01/04 Javascript
vue里面父组件修改子组件样式的方法
2018/02/03 Javascript
Electron-vue脚手架改造vue项目的方法
2018/10/22 Javascript
微信小程序下拉菜单效果的实例代码
2019/05/14 Javascript
javascript操作向表格中动态加载数据
2020/08/27 Javascript
Javascript中window.name属性详解
2020/11/19 Javascript
python在windows下实现ping操作并接收返回信息的方法
2015/03/20 Python
Python中zfill()方法的使用教程
2015/05/20 Python
在Python中处理列表之reverse()方法的使用教程
2015/05/21 Python
Python中字符串的常见操作技巧总结
2016/07/28 Python
详解python中的Turtle函数库
2018/11/19 Python
Python3.5模块的定义、导入、优化操作图文详解
2019/04/27 Python
Golang GBK转UTF-8的例子
2019/08/26 Python
Python高级特性之闭包与装饰器实例详解
2019/11/19 Python
pytorch中的自定义反向传播,求导实例
2020/01/06 Python
Python urllib request模块发送请求实现过程解析
2020/12/10 Python
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
PUMA澳大利亚官方网站:德国运动品牌
2018/10/19 全球购物
主办会计岗位职责
2014/03/13 职场文书
消防宣传口号
2014/06/16 职场文书
2014年加油站站长工作总结
2014/12/23 职场文书
出纳岗位职责
2015/01/31 职场文书
小学六一儿童节活动开幕词
2016/03/04 职场文书
毕业生自荐求职信书写的技巧
2019/08/26 职场文书
Python编写nmap扫描工具
2021/07/21 Python