我正在使用数学包SAGE,它是用Python编写的。
我正在尝试操纵一些向量集,并继续收到上述错误消息。我完全不知道它告诉我什么,虽然我明白了什么是可变的意味着有人可以用相当简单的概念术语来解释它告诉我的错误吗?
答案 0 :(得分: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)])
希望这有帮助。
答案 1 :(得分:3)
您只能在set
s:
set对象是不同hashable个对象的无序集合。
对于Python,这意味着该对象必须实现__hash__
方法,以及__eq__
或__cmp__
。
可变对象不实现这样的方法,不能存储在set
中。您可以存储不可变序列set
,例如tuple
或frozenset
。
文档的另一个引用:
如果对象具有在其生命周期内永远不会更改的哈希值(它需要
__hash__()
方法),并且可以与其他对象进行比较(它需要__eq__()
或{{ 1}}方法)。比较相等的Hashable对象必须具有相同的哈希值。Hashability使对象可用作字典键和set成员,因为这些数据结构在内部使用哈希值。
所有Python的不可变内置对象都是可清除的,而没有可变容器(例如列表或字典)。默认情况下,作为用户定义类实例的对象是可清除的;他们都比较不平等,他们的哈希值是他们的
__cmp__()
。
答案 2 :(得分:1)
这意味着Python不能使用'vectors'的内容来构建一个集合,因为'vector object'只是它内容的'指针':内容不是'固定'而你可以更改它使用相同的向量vatiable(Python必须重建集合以保持其工作)。
因此,您只能使用不可变对象的'set'(如元组,字符串,数字)。
E.g。
>>> 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的内容。