淺談Python的字典鍵名可以是哪些類型
今天看別人代碼時(shí)發(fā)現(xiàn)一個(gè)事,就是把對(duì)象當(dāng)作字典的鍵名,并且把兩個(gè)對(duì)象(類的實(shí)例)當(dāng)作鍵名,然后去查了下:
鍵必須是不可變的,如字符串,數(shù)字或元組。
1 鍵的類型,列表/字典不可以,其它都可以
但是網(wǎng)上卻沒(méi)有說(shuō)其他類型可不可以,怎么用的。我寫代碼試了下:
class Person: def __init__(self, name): self.name = name i = 5 s = 'abc' t = (5,'a') p = Person('Lily') q = Person('xiao') m = {'a':1, 'b':10} lst = [1,2,3] d = {} d[i] = 'five' d[s] = 'ABC' d[t] = 'five-a' d[p] = 'name:Lily' # d[lst] = 'list : 1,2,3' # TypeError: unhashable type: 'list' d[p, q] = 'two people: Lily and xiao' d[i,s,t,p,q] = 'all in key' for k, v in d.items(): print(k, '=>', v)
輸出結(jié)果:
5 => five
abc => ABC
(5, 'a') => five-a
<__main__.Person object at 0x000001803EEF27F0> => name:Lily
(<__main__.Person object at 0x000001803EEF27F0>, <__main__.Person object at 0x000001803EEF28D0>) => two people: Lily and xiao
(5, 'abc', (5, 'a'), <__main__.Person object at 0x000001803EEF27F0>, <__main__.Person object at 0x000001803EEF28D0>) => all in key
2 多個(gè)對(duì)象可當(dāng)作鍵名,順序不同時(shí)是不同的鍵
print(d[p, q]) print(d[q, p])
輸出:
two people: Lily and xiao
Traceback (most recent call last):File "<ipython-input-15-12aff481ab93>", line 1, in <module>
runfile('C:/Users/Xpeng/.spyder-py3/temp.py', wdir='C:/Users/Xpeng/.spyder-py3')File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
execfile(filename, namespace)File "D:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)File "C:/Users/Xpeng/.spyder-py3/temp.py", line 37, in <module>
print(d[q, p])KeyError: (<__main__.Person object at 0x000001803EF58940>, <__main__.Person object at 0x000001803EF58668>)
3 結(jié)論【有誤】:
(1)除了列表不能當(dāng)作鍵名,其它都 可以,還可以放多個(gè)。
(2)我是這樣理解的,列表是可變的,其他類型都是不可變的。對(duì)象作為鍵名時(shí),實(shí)際傳入的是對(duì)象的地址,也是不可變的。
(3)放多個(gè)時(shí)不同順序時(shí)鍵不同。
------2020.04.07更新-----
感謝兩次網(wǎng)友的提醒。
(1)準(zhǔn)確的說(shuō)是列表、字典這種不可哈希(unhashable)的類型不可當(dāng)做鍵值,可哈希的類型才可當(dāng)作鍵。
到此這篇關(guān)于淺談Python的字典鍵名可以是哪些類型的文章就介紹到這了,更多相關(guān)Python 字典鍵名 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python多進(jìn)程池 multiprocessing Pool用法示例
這篇文章主要介紹了Python多進(jìn)程池 multiprocessing Pool用法,結(jié)合實(shí)例形式分析了多進(jìn)程池 multiprocessing Pool相關(guān)概念、原理及簡(jiǎn)單使用技巧,需要的朋友可以參考下2018-09-09Python 經(jīng)典貪心算法之Prim算法案例詳解
這篇文章主要介紹了Python 經(jīng)典貪心算法之Prim算法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09Python設(shè)計(jì)模式之組合模式原理與用法實(shí)例分析
這篇文章主要介紹了Python設(shè)計(jì)模式之組合模式,結(jié)合具體實(shí)例形式分析了Python組合模式的相關(guān)概念、原理、定義及使用方法,需要的朋友可以參考下2019-01-01Python多線程threading模塊用法實(shí)例分析
這篇文章主要介紹了Python多線程threading模塊用法,結(jié)合實(shí)例形式分析了Python多線程threading模塊原理、功能、常見(jiàn)應(yīng)用及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-05-05python關(guān)于多值參數(shù)的實(shí)例詳解
在本篇內(nèi)容里小編給大家整理了一篇關(guān)于python關(guān)于多值參數(shù)的實(shí)例詳解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。2021-07-07利用soaplib搭建webservice詳細(xì)步驟和實(shí)例代碼
這篇文章主要介紹了使用python soaplib搭建webservice詳細(xì)步驟和實(shí)例代碼,大家可以參考使用2013-11-11