2015-08-30 20 views
3

同時加入的ByteArray作爲關鍵一本字典我收到此錯誤:添加一個字節組作爲重點字典

TypeError: unhashable type: 'bytearray' 

下面是代碼:

str_dict = {} 
s = bytearray(10) 

for x in range(0, 10): 
    value = get_str(s) 
    str_dict[s] = value 

所以我創建一個bytearray和函數get_str(s)更新s並返回一個'value'。我想添加值和更新s到字典。我收到上面的錯誤。

+1

如果您必須使用列表式的東西作​​爲字典鍵,然後使用元組。 – pasztorpisti

+0

「字典的鍵值幾乎是任意值,不可哈希的值,即包含列表,字典或其他可變類型(通過值而不是對象標識進行比較)的值不能用作鍵。」從https://docs.python.org/2/library/stdtypes.html#mapping-types-dict –

回答

4
{[1, 2, 3]: 1} 

TypeError: unhashable type: 'list' 

一個字典密鑰必須是不可變的類型。

列表或字節數組不能用作關鍵字,因爲它們是可變的,因此它們不能是唯一的,因爲它們可以更改。


看來,如果一個對象作爲__hash__方法也可以使用,就好像一個關鍵:

I'm able to use a mutable object as a dictionary key in python. Is this not disallowed?

+0

可以在addiing之前將bytearray轉換爲不可變類型嗎? – user220201

+0

由於pasztorpisti建議在你的問題的評論,你可能會考慮轉換它在元組,雖然我不知道這是可能的,你可以嘗試它... – Richard

+0

@理查德:是的:'元組(bytearray_instance)' – pasztorpisti

1

Unhashable /不可變對象不能用作鍵的,因爲你可能不找到他們你已經把它們映射:-)如何映射實際上是實現(通過散列桶)

x = [1, 2] 
# suppose this works 
mapping = {x: "this is x"} 
# change x 
x.append(3) 

思前想後,我們(可能)現在有一個關鍵在錯誤的桶(在[1, 2]的桶)。我們是永遠不會去找它。

您可以創建一個string或使用tuple(兩者都是不可變的)並將它們用作關鍵字。