深入理解Python中字典的鍵的使用
字典的鍵
字典中的值沒有任何限制, 可以是任意Python對象,即從標(biāo)準(zhǔn)對象到用戶自定義對象皆可,但是字典中的鍵是有類型限制的。
(1)不允許一個鍵對應(yīng)多個值
必須明確一條原則:每個鍵只能對應(yīng)一個項。也就是說:一鍵對應(yīng)多個值是不允許的(像列表、元組和其他字典這樣的容器對象是可以的)。 當(dāng)有鍵發(fā)生沖突(即字典鍵重復(fù)賦值),取最后(最近)的賦值。Python并不會因字典中的鍵存在沖突而產(chǎn)生一個錯誤,它不會檢查鍵的沖突是因?yàn)槿绻孢@樣做的話,在每個鍵-值對賦值的時候都會做檢查,這將會占用一定量的內(nèi)存。
>>> dict1 = {'foo':789, 'foo': 'xyz'}
>>> dict1
{'foo': 'xyz'}
>>> dict1['foo'] = 123
>>> dict1
{'foo': 123}
(2)鍵必須是可哈希的
大多數(shù)Python對象可以作為鍵,但它們必須是可哈希的對象。像列表和字典這樣的可變類型,由于它們不是可哈希的,所以不能作為鍵。
所有不可變的類型都是可哈希的,因此它們都可以做為字典的鍵。要說明的是:值相等的數(shù)字表示相同的鍵,即整型數(shù)字1和浮點(diǎn)數(shù)1.0的哈希值是相同的,它們是相同的鍵。
同時,也有一些可變對象(很少)是可哈希的,它們可以做字典的鍵,但很少見。舉一個例子,一個實(shí)現(xiàn)了__hash__() 特殊方法的類。因?yàn)開_hash__()方法返回一個整數(shù),所以仍然是用不可變的值(做字典的鍵)。
為什么鍵必須是可哈希的?解釋器調(diào)用哈希函數(shù),根據(jù)字典中鍵的值來計算存儲你的數(shù)據(jù)的位置。如果鍵是可變對象,它的值可改變。如果鍵發(fā)生變化,哈希函數(shù)會映射到不同的地址來存儲數(shù)據(jù)。如果這樣的情況發(fā)生,哈希函數(shù)就不可能可靠地存儲或獲取相關(guān)的數(shù)據(jù)。選擇可哈希的鍵的原因就是因?yàn)樗鼈兊闹挡荒芨淖儭?br />
數(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!' %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()
相關(guān)文章
Python中shutil模塊的常用文件操作函數(shù)用法示例
shutil模塊提供比OS模塊更強(qiáng)大的本地文件操作功能,包括文件的壓縮和解壓縮等,下面我們就來列舉Python中shutil模塊的常用文件操作函數(shù)用法示例:2016-07-07
如何基于Python + requests實(shí)現(xiàn)發(fā)送HTTP請求
這篇文章主要介紹了如何基于Python + requests實(shí)現(xiàn)發(fā)送HTTP請求,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01
Python使用asyncio包實(shí)現(xiàn)異步編程方式
這篇文章主要介紹了Python使用asyncio包實(shí)現(xiàn)異步編程方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06
使用NumPy讀取MNIST數(shù)據(jù)的實(shí)現(xiàn)代碼示例
這篇文章主要介紹了使用NumPy讀取MNIST數(shù)據(jù)的實(shí)現(xiàn)代碼示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11

