2012-12-29 78 views
2

我正在使用數學包SAGE,它是用Python編寫的。python:「mutable vectors are unshashable」error

我想操縱一些向量集,並繼續獲取上述錯誤消息。我完全不知道它告訴我什麼,但我明白什麼是可變的手段有人能用相當簡單的概念術語解釋它告訴我的是錯誤的嗎?

+2

向我們展示整個異常堆棧跟蹤和導致它的代碼。 –

回答

1

這意味着Python不能使用'vectors'的內容來構建一個集合,因爲'vector object'只是它的內容的'指針':內容不是'固定的',你可以改變它重新使用相同的矢量vatiable(Python將不得不重建集以保持它的工作)。

所以,你可以只使用'set'不變對象(如元組,字符串,數字)。

例如

>>> l1 = [1, 2, 3] 
>>> l2 = [3, 4, 5] 
>>> set([l1, l2]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: unhashable type: 'list' 

這是因爲您可以更改l1和l2(例如使用.append)。

>>> t1 = (1, 2, 3) 
>>> t2 = (3, 4, 5) 
>>> set([t1, t2]) 
set([(3, 4, 5), (1, 2, 3)]) 

在這種情況下,您不能更改t1和t2的內容。

3

你只能把哈希的對象set S:

一組對象是不同的hashable對象的無序集合。

對於Python,它意味着該對象必須實現一個__hash__方法,以及__eq____cmp__

可變對象不執行這樣的方法,也不能存儲在set中。您可以存儲不可變的序列,如set,如tuplefrozenset

從文檔另一個報價:

一個目的是可哈希如果它有一個哈希值在其壽命期間,其從不改變(它需要一個__hash__()方法),並且可相對於其他對象(它需要__eq__()__cmp__()方法)。比較相等的哈希對象必須具有相同的哈希值。

Hashability使對象可用作字典鍵和集合成員,因爲這些數據結構在內部使用散列值。

Python的所有不可變內置對象都是可散列的,而沒有可變容器(如列表或字典)。作爲用戶定義類的實例的對象默認是可哈希的;他們都比較不等,他們的散列值是他們的id()

+0

謝謝,但對我來說,這仍然是技術性的......下面的答案種類 - 解決它。 – GaryMak

4

我假定你正在尋找類似

sage: V = vector([1,2,3]) 
sage: W = vector([3,4,5]) 
sage: set([V,W]) 
<snip> 
TypeError: mutable vectors are unhashable 
sage: 

您可以修復以下方式這一默認設置。

sage: V.set_immutable(); W.set_immutable() 
sage: set([V,W]) 
set([(3, 4, 5), (1, 2, 3)]) 

希望這會有所幫助。