2013-05-26 40 views
5

當使用Python中的字典,以下是不可能的:爲什麼Python哈希列表不使用ID?

d = {} 
d[[1,2,3]] = 4 

因爲'list' is an unhashable type。但是,Python中的id函數會返回一個對象的整數,該對象在對象的生存期內保證是唯一的。

爲什麼Python不使用id散列字典?有缺點嗎?

回答

11

的原因就在這裏(Why must dictionary keys be immutable

已經提出了一些解決方案,不能接受:通過他們的地址(對象ID)

  • 哈希表。這是行不通的,因爲如果你使用相同的值構造一個新的列表,它將不會被找到;例如爲:

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

    print mydict[[1, 2]]因爲在第二行中使用的[1, 2]的ID不同於在第一行

將提高KeyError異常。換句話說,應該使用==來比較字典密鑰,而不是使用is

+0

啊,感謝 - 這就是我一直在尋找。 – sdasdadas

+0

...如果你*想要通過id來哈希,出於某種原因,你可以做到這一點。 – Elazar

5

這是一個要求,如果a == b,那麼hash(a) == hash(b)。使用id可以解決這個問題,因爲如果您改變列表,ID不會改變。那麼你可能有兩個列表具有相同的內容,但具有不同的哈希值。

另一種看待它的方式是,你可以這樣做,但這意味着你無法用另一個具有相同內容的列表檢索字典值。您只能使用與密鑰完全相同的列表對象來檢索它。

0

在Python字典鍵中使用==進行比較,並且帶有列表的相等運算符執行逐項相等檢查,因此具有相同元素的兩個不同列表的比較相等,並且它們必須在字典中的行爲相同。

如果您需要通過身份而不是平等來保存字典或一組列表,您可以將列表包裝在用戶定義的對象中,或者根據上下文,可以使用存儲元素的字典/通過明確使用id來檢索。

然而要注意保持存儲並不意味着對象將保持活着,沒有辦法從id將對象的對象的idid可能對已收集垃圾的對象被重複使用一段時間。一個解決方案是使用,而不是

my_dict[id(x)] = [x, value] 

my_dict[id(x)] = value