2016-11-18 157 views
3

我有一本字典d存儲有關對象的一些信息:使用對象作爲字典鍵

class A: 
    def __init__(self, x): 
     self.x = x 

a = A(1) 
b = A(1) 
c = 'hello world' 
e = [1, 2, 3] 

d = {a: 'a', b: 'b', c: 'c', e: 'e'} 

出現了兩個問題:

  1. 這種方法不適用於列表或其他物體,其哈希工作不對應於存儲地址。在這種情況下我能做些什麼?
  2. 該方法在問題(1)中提到的其他條件下是不安全的嗎?
+0

有一個字典的關鍵是值的點是什麼?只有在對象可以被哈希(具有__hash__定義)時纔會被支持。使用列表或集合有什麼問題? –

+0

因此,您正嘗試將對象用作字典中的鍵。我不明白這個動機。 – pylang

+0

您必須將對象作爲字典的鍵嗎?難道你不能做像保持對象在一個單獨的列表,並使用該列表的索引作爲關鍵? – Ulisha

回答

2

爲了用作一個字典的鍵,對象必須支持hash功能(例如,通過__hash__),相等比較(例如,通過__eq____cmp__),並且必須滿足上述條件的正確性。

也就是說,列表不能用作字典鍵的簡單答案是列表不提供有效的__hash__方法。

詳細信息請參考Why Lists Can't Be Dictionary Keys?

但是您可以使用tuple()對象而不是key作爲元組可哈希值。因此,這是有效的:

>>> e = (1, 2, 3) 
>>> d = {a: 'a', b: 'b', c: 'c', e: 'e'}