當使用Python中的字典,以下是不可能的:爲什麼Python哈希列表不使用ID?
d = {}
d[[1,2,3]] = 4
因爲'list' is an unhashable type
。但是,Python中的id
函數會返回一個對象的整數,該對象在對象的生存期內保證是唯一的。
爲什麼Python不使用id
散列字典?有缺點嗎?
當使用Python中的字典,以下是不可能的:爲什麼Python哈希列表不使用ID?
d = {}
d[[1,2,3]] = 4
因爲'list' is an unhashable type
。但是,Python中的id
函數會返回一個對象的整數,該對象在對象的生存期內保證是唯一的。
爲什麼Python不使用id
散列字典?有缺點嗎?
的原因就在這裏(Why must dictionary keys be immutable)
已經提出了一些解決方案,不能接受:通過他們的地址(對象ID)
哈希表。這是行不通的,因爲如果你使用相同的值構造一個新的列表,它將不會被找到;例如爲:
mydict = {[1, 2]: '12'}
print mydict[[1, 2]]
因爲在第二行中使用的[1, 2]
的ID不同於在第一行將提高
KeyError
異常。換句話說,應該使用==
來比較字典密鑰,而不是使用is
。
這是一個要求,如果a == b
,那麼hash(a) == hash(b)
。使用id
可以解決這個問題,因爲如果您改變列表,ID不會改變。那麼你可能有兩個列表具有相同的內容,但具有不同的哈希值。
另一種看待它的方式是,你可以這樣做,但這意味着你無法用另一個具有相同內容的列表檢索字典值。您只能使用與密鑰完全相同的列表對象來檢索它。
在Python字典鍵中使用==
進行比較,並且帶有列表的相等運算符執行逐項相等檢查,因此具有相同元素的兩個不同列表的比較相等,並且它們必須在字典中的行爲相同。
如果您需要通過身份而不是平等來保存字典或一組列表,您可以將列表包裝在用戶定義的對象中,或者根據上下文,可以使用存儲元素的字典/通過明確使用id
來檢索。
然而要注意保持存儲並不意味着對象將保持活着,沒有辦法從id
將對象的對象的id
和id
可能對已收集垃圾的對象被重複使用一段時間。一個解決方案是使用,而不是
my_dict[id(x)] = [x, value]
my_dict[id(x)] = value
啊,感謝 - 這就是我一直在尋找。 – sdasdadas
...如果你*想要通過id來哈希,出於某種原因,你可以做到這一點。 – Elazar