真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Python中字典key是不是不可變的-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!

創(chuàng)新互聯(lián)公司專注于企業(yè)網(wǎng)絡(luò)營(yíng)銷推廣、網(wǎng)站重做改版、富裕網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5開發(fā)、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為富裕等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

小編給大家分享一下Python中字典key是不是不可變的,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討方法吧!

為什么字典的key必須是不可變的?

字典的哈希表實(shí)現(xiàn)使用從鍵值計(jì)算的哈希值來查找鍵。

如果鍵是可變對(duì)象,則其值可能會(huì)發(fā)生變化,因此其哈希值也會(huì)發(fā)生變化。

但是,由于無論誰更改鍵對(duì)象都無法判斷它是否被用作字典鍵值,因此無法在字典中修改條目。

然后,當(dāng)你嘗試在字典中查找相同的對(duì)象時(shí),將無法找到它,因?yàn)槠涔V挡煌?/p>

如果你嘗試查找舊值,也不會(huì)找到它,因?yàn)樵谠摴1碇姓业降膶?duì)象的值會(huì)有所不同。

如果你想要一個(gè)用列表索引的字典,只需先將列表轉(zhuǎn)換為元組;用函數(shù) tuple(L) 創(chuàng)建一個(gè)元組,其條目與列表 L相同。元組是不可變的,因此可以用作字典鍵。

已經(jīng)提出的一些不可接受的解決方案:

哈希按其地址(對(duì)象ID)列出。這不起作用,因?yàn)槿绻銟?gòu)造一個(gè)具有相同值的新列表,它將無法找到;例如:

mydict = {[1, 2]: '12'}
print(mydict[[1, 2]])

會(huì)引發(fā)一個(gè) KeyError 異常,因?yàn)榈诙兄惺褂玫?nbsp;[1, 2] 的 id 與第一行中的 id 不同。換句話說,應(yīng)該使用 == 來比較字典鍵,而不是使用 is 。

使用列表作為鍵時(shí)進(jìn)行復(fù)制。這沒有用的,因?yàn)樽鳛榭勺儗?duì)象的列表可以包含對(duì)自身的引用,然后復(fù)制代碼將進(jìn)入無限循環(huán)。

允許列表作為鍵,但告訴用戶不要修改它們。當(dāng)你意外忘記或修改列表時(shí),這將產(chǎn)生程序中的一類難以跟蹤的錯(cuò)誤。它還使一個(gè)重要的字典不變量無效:d.keys() 中的每個(gè)值都可用作字典的鍵。

將列表用作字典鍵后,應(yīng)標(biāo)記為其只讀。問題是,它不僅僅是可以改變其值的頂級(jí)對(duì)象;你可以使用包含列表作為鍵的元組。將任何內(nèi)容作為鍵關(guān)聯(lián)到字典中都需要將從那里可到達(dá)的所有對(duì)象標(biāo)記為只讀 —— 并且自引用對(duì)象可能會(huì)導(dǎo)致無限循環(huán)。

如果需要,可以使用以下方法來解決這個(gè)問題,但使用它需要你自擔(dān)風(fēng)險(xiǎn):你可以將一個(gè)可變結(jié)構(gòu)包裝在一個(gè)類實(shí)例中,該實(shí)例同時(shí)具有 __eq__() 和 __hash__() 方法。

然后,你必須確保駐留在字典(或其他基于 hash 的結(jié)構(gòu))中的所有此類包裝器對(duì)象的哈希值在對(duì)象位于字典(或其他結(jié)構(gòu))中時(shí)保持固定。

class ListWrapper:
    def __init__(self, the_list):
        self.the_list = the_list
    def __eq__(self, other):
        return self.the_list == other.the_list
    def __hash__(self):
        l = self.the_list
        result = 98767 - len(l)*555
        for i, el in enumerate(l):
            try:
                result = result + (hash(el) % 9999999) * 1001 + i
            except Exception:
                result = (result % 7777777) + i * 333
        return result

注意,哈希計(jì)算由于列表的某些成員可能不可用以及算術(shù)溢出的可能性而變得復(fù)雜。

此外,必須始終如此,如果 o1 == o2 (即 o1.__eq__(o2) is True )則 hash(o1) == hash(o2)``(即``o1.__hash__() == o2.__hash__() ),無論對(duì)象是否在字典中。如果你不能滿足這些限制,字典和其他基于 hash 的結(jié)構(gòu)將會(huì)出錯(cuò)。

對(duì)于 ListWrapper ,只要包裝器對(duì)象在字典中,包裝列表就不能更改以避免異常。除非你準(zhǔn)備好認(rèn)真考慮需求以及不正確地滿足這些需求的后果,否則不要這樣做。請(qǐng)留意。

看完了這篇文章,相信你對(duì)Python中字典key是不是不可變的有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道,感謝各位的閱讀!


當(dāng)前題目:Python中字典key是不是不可變的-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://weahome.cn/article/dosdho.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部