亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我不能在python中使用列表作為dict鍵?

為什么我不能在python中使用列表作為dict鍵?

一只名叫tom的貓 2019-08-02 16:47:05
為什么我不能在python中使用列表作為dict鍵?關于什么可以/不能用作python dict的鍵,我有點困惑。dicked = {}dicked[None] = 'foo'     # None okdicked[(1,3)] = 'baz'    # tuple okimport sysdicked[sys] = 'bar'      # wow, even a module is ok !dicked[(1,[3])] = 'qux'  # oops, not allowed所以一個元組是一個不可變的類型,但是如果我在其中隱藏一個列表,那么它就不能成為一個鍵......難道我不能輕易地隱藏模塊中的列表嗎?我有一個模糊的想法,關鍵是必須“可以”,但我只是承認自己對技術細節的無知; 我不知道這里到底發生了什么。如果您嘗試使用列表作為鍵,將哈希作為其內存位置,會出現什么問題?
查看完整描述

3 回答

?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

在Python維基中有一篇關于這個主題的好文章:為什么列表不能是字典鍵。如上所述:

如果您嘗試使用列表作為鍵,將哈希作為其內存位置,會出現什么問題?

它可以在不破壞任何要求的情況下完成,但會導致意外行為。列表通常被視為其值來自其內容的值,例如在檢查(in-)相等時。許多人 - 可以理解 - 希望你可以使用任何列表[1, 2]來獲得相同的密鑰,在那里你必須保持完全相同的列表對象。但是,一旦用作密鑰的列表被修改,就會通過值中斷進行查找,并且對于按身份查找,需要您保持完全相同的列表 - 這對于任何其他常見列表操作都是不需要的(至少我無法想到)。

其他對象,比如模塊,object無論如何都要從它們的對象身份中做出更大的交易(當你最后一次調用兩個不同的模塊對象時sys?),并且無論如何都要進行比較。因此,當用作字典鍵時,它們在這種情況下通過身份進行比較也就不那么令人驚訝 - 甚至是預期的。


查看完整回答
反對 回復 2019-08-02
?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

為什么我不能在python中使用列表作為dict鍵?

>>> d = {repr([1,2,3]): 'value'}{'[1, 2, 3]': 'value'}

(對于任何偶然發現這個問題尋找方法的人)

正如其他人在這里解釋的那樣,確實你不能。但是,如果您真的想使用列表,則可以使用其字符串表示。


查看完整回答
反對 回復 2019-08-02
?
UYOU

TA貢獻1878條經驗 獲得超4個贊


問題是元組是不可變的,而列表則不是??紤]以下


d = {}

li = [1,2,3]

d[li] = 5

li.append(4)

應該d[li]返回什么?是同一個名單嗎?怎么樣d[[1,2,3]]?它具有相同的值,但是列表不同?


最終,沒有令人滿意的答案。例如,如果唯一有效的密鑰是原始密鑰,那么如果您沒有引用該密鑰,則永遠不能再次訪問該值。使用其他所有允許的密鑰,您可以構建密鑰而無需引用原始密鑰。


如果我的兩個建議都有效,那么你有非常不同的鍵返回相同的值,這有點令人驚訝。如果只有原始內容有效,那么您的密鑰將很快變壞,因為要對列表進行修改。


查看完整回答
反對 回復 2019-08-02
  • 3 回答
  • 0 關注
  • 1153 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號