我正在使用Python编写的数学软件包SAGE。我试图操作一些向量集,但总是收到上述错误消息。虽然我知道mutable是什么意思,但我完全不知道它告诉我的内容。可以有人用相对简单的概念解释一下我的错误在哪里吗?
我猜您正在寻找类似以下的内容:
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)])
您只能在set
中放置可哈希对象:
集合对象是一个无序的包含不同可哈希对象的集合。
对于Python而言,这意味着对象必须实现一个__hash__
方法,以及__eq__
或__cmp__
方法。
可变对象没有实现这样的方法,因此不能存储在set
中。您可以将不可变序列存储在set
中,例如tuple
或frozenset
。
文档中的另一句话:
一个对象如果有一个哈希值,其在生命周期内不会改变(需要一个__hash__()
方法),并且可以与其他对象进行比较(需要一个__eq__()
或__cmp__()
方法),则它是可哈希的。相等的可哈希对象必须具有相同的哈希值。id()
。这意味着Python无法使用“向量”内容构建集合,因为“向量对象”只是指向其内容的“指针”:内容不是“固定的”,您可以更改它并重新使用相同的向量变量(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)])