内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

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

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

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

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

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

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

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

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

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

如果你嘗試查找舊值,也不會找到它,因?yàn)樵谠摴1碇姓业降膶ο蟮闹禃兴煌?/p>

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

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

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

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

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

使用列表作為鍵時進(jìn)行復(fù)制。這沒有用的,因?yàn)樽鳛榭勺儗ο蟮牧斜砜梢园瑢ψ陨淼囊?,然后?fù)制代碼將進(jìn)入無限循環(huán)。

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

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

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

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

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

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

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

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

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

分享文章:Python中字典key是不是不可變的-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://www.rwnh.cn/article40/dosdho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、微信小程序、網(wǎng)站建設(shè)網(wǎng)站收錄、動態(tài)網(wǎng)站電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司
务川| 静安区| 万山特区| 北流市| 胶南市| 武陟县| 唐河县| 怀仁县| 赫章县| 公主岭市| 文登市| 河南省| 区。| 宁强县| 辽中县| 乐昌市| 阿合奇县| 托克托县| 灯塔市| 固始县| 拜泉县| 高青县| 陇南市| 昔阳县| 白城市| 毕节市| 新竹县| 崇左市| 石渠县| 游戏| 桃江县| 沧州市| 大悟县| 中超| 梁河县| 安泽县| 东丽区| 日土县| 孟村| 凭祥市| 沙坪坝区|