国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

深入理解Python中字典的鍵的使用

2019-11-25 17:05:21
字體:
供稿:網(wǎng)友

字典的鍵

       字典中的值沒有任何限制, 可以是任意Python對象,即從標準對象到用戶自定義對象皆可,但是字典中的鍵是有類型限制的。
(1)不允許一個鍵對應(yīng)多個值
        必須明確一條原則:每個鍵只能對應(yīng)一個項。也就是說:一鍵對應(yīng)多個值是不允許的(像列表、元組和其他字典這樣的容器對象是可以的)。 當有鍵發(fā)生沖突(即字典鍵重復賦值),取最后(最近)的賦值。Python并不會因字典中的鍵存在沖突而產(chǎn)生一個錯誤,它不會檢查鍵的沖突是因為如果真這樣做的話,在每個鍵-值對賦值的時候都會做檢查,這將會占用一定量的內(nèi)存。

  >>> dict1 = {'foo':789, 'foo': 'xyz'}   >>> dict1   {'foo': 'xyz'}   >>> dict1['foo'] = 123   >>> dict1   {'foo': 123} 

(2)鍵必須是可哈希的

       大多數(shù)Python對象可以作為鍵,但它們必須是可哈希的對象。像列表和字典這樣的可變類型,由于它們不是可哈希的,所以不能作為鍵。
       所有不可變的類型都是可哈希的,因此它們都可以做為字典的鍵。要說明的是:值相等的數(shù)字表示相同的鍵,即整型數(shù)字1和浮點數(shù)1.0的哈希值是相同的,它們是相同的鍵。
       同時,也有一些可變對象(很少)是可哈希的,它們可以做字典的鍵,但很少見。舉一個例子,一個實現(xiàn)了__hash__() 特殊方法的類。因為__hash__()方法返回一個整數(shù),所以仍然是用不可變的值(做字典的鍵)。
       為什么鍵必須是可哈希的?解釋器調(diào)用哈希函數(shù),根據(jù)字典中鍵的值來計算存儲你的數(shù)據(jù)的位置。如果鍵是可變對象,它的值可改變。如果鍵發(fā)生變化,哈希函數(shù)會映射到不同的地址來存儲數(shù)據(jù)。如果這樣的情況發(fā)生,哈希函數(shù)就不可能可靠地存儲或獲取相關(guān)的數(shù)據(jù)。選擇可哈希的鍵的原因就是因為它們的值不能改變。
        數(shù)字和字符串可以被用做字典的鍵,元組是不可變的但也可能不是一成不變的,因此用元組做有效的鍵必須要加限制:若元
組中只包括像數(shù)字和字符串這樣的不可變參數(shù),才可以作為字典中有效的鍵。

示例:
# 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!' %namedef 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)uitEnter 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()

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 郎溪县| 同德县| 昭平县| 麟游县| 白城市| 泗洪县| 普洱| 安西县| 吴江市| 连云港市| 汝城县| 龙陵县| 广南县| 兰州市| 揭阳市| 浮梁县| 嘉荫县| 无锡市| 安康市| 武汉市| 西昌市| 麦盖提县| 福鼎市| 舞钢市| 荣昌县| 措勤县| 织金县| 历史| 乐至县| 定结县| 渑池县| 上高县| 定兴县| 忻城县| 台山市| 涞源县| 澎湖县| 洛浦县| 娱乐| 吉隆县| 华蓥市|