3 回答

TA貢獻2041條經驗 獲得超4個贊
在Python維基中有一篇關于這個主題的好文章:為什么列表不能是字典鍵。如上所述:
如果您嘗試使用列表作為鍵,將哈希作為其內存位置,會出現什么問題?
它可以在不破壞任何要求的情況下完成,但會導致意外行為。列表通常被視為其值來自其內容的值,例如在檢查(in-)相等時。許多人 - 可以理解 - 希望你可以使用任何列表[1, 2]
來獲得相同的密鑰,在那里你必須保持完全相同的列表對象。但是,一旦用作密鑰的列表被修改,就會通過值中斷進行查找,并且對于按身份查找,需要您保持完全相同的列表 - 這對于任何其他常見列表操作都是不需要的(至少我無法想到)。
其他對象,比如模塊,object
無論如何都要從它們的對象身份中做出更大的交易(當你最后一次調用兩個不同的模塊對象時sys
?),并且無論如何都要進行比較。因此,當用作字典鍵時,它們在這種情況下通過身份進行比較也就不那么令人驚訝 - 甚至是預期的。

TA貢獻1872條經驗 獲得超4個贊
為什么我不能在python中使用列表作為dict鍵?
>>> d = {repr([1,2,3]): 'value'}{'[1, 2, 3]': 'value'}
(對于任何偶然發現這個問題尋找方法的人)
正如其他人在這里解釋的那樣,確實你不能。但是,如果您真的想使用列表,則可以使用其字符串表示。

TA貢獻1878條經驗 獲得超4個贊
問題是元組是不可變的,而列表則不是??紤]以下
d = {}
li = [1,2,3]
d[li] = 5
li.append(4)
應該d[li]返回什么?是同一個名單嗎?怎么樣d[[1,2,3]]?它具有相同的值,但是列表不同?
最終,沒有令人滿意的答案。例如,如果唯一有效的密鑰是原始密鑰,那么如果您沒有引用該密鑰,則永遠不能再次訪問該值。使用其他所有允許的密鑰,您可以構建密鑰而無需引用原始密鑰。
如果我的兩個建議都有效,那么你有非常不同的鍵返回相同的值,這有點令人驚訝。如果只有原始內容有效,那么您的密鑰將很快變壞,因為要對列表進行修改。
添加回答
舉報