3

我正在使用用 Python 编写的数学包 SAGE。

我正在尝试操作一些向量集,并且不断收到上述错误消息。我完全不知道它告诉我什么,虽然我明白什么是可变的意思有人可以用相当简单的概念术语解释它告诉我什么是错误的吗?

4

3 回答 3

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)])

希望这可以帮助。

于 2012-12-29T23:37:59.673 回答
3

您只能将可散列对象放在sets 中:

集合对象是不同的可散列对象的无序集合。

对于 Python,这意味着对象必须实现一个__hash__方法,以及__eq__or __cmp__

可变对象不实现这种方法,也不能存储在set. 您可以将不可变序列存储为 a set,例如 atuplefrozenset

文档中的另一个引用:

如果一个对象的哈希值在其生命周期内永远不会改变(它需要一个__hash__()方法),并且可以与其他对象进行比较(它需要一个__eq__()or__cmp__()方法),那么它就是可哈希的。比较相等的可散列对象必须具有相同的散列值。

哈希性使对象可用作字典键和集合成员,因为这些数据结构在内部使用哈希值。

Python 的所有不可变内置对象都是可散列的,而没有可变容器(例如列表或字典)是可散列的。默认情况下,作为用户定义类实例的对象是可散列的;它们都比较不相等,它们的哈希值是它们的id().

于 2012-12-29T17:50:47.973 回答
1

这意味着 Python 不能使用“向量”的内容来构建集合,因为“向量对象”只是指向其内容的“指针”:内容不是“固定的”,您可以重新使用相同的内容进行更改向量变量(Python 必须重建该集合以使其正常工作)。

因此,您只能对不可变对象(如元组、字符串、数字)使用“集合”。

例如

>>> 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 的内容。

于 2012-12-29T17:52:01.467 回答