错误:列表对象不可用

时间:2010-07-16 21:26:16

标签: python set

 closed = set() -here closed is a set

节点是(5,5)

执行时出现错误。

错误是:

列表对象不可用

该计划是:

closed.add(node)
for val in closed:
      print val   

Node是堆栈的输出。

node = stack.pop() - it gives me...(5,5)

回溯:

File "/home/", line 99, in depthFirstSearch
    closed.add(node)
TypeError: list objects are unhashable

7 个答案:

答案 0 :(得分:2)

显示您执行的实际代码以及完整的回溯。使用复制/粘贴,不要从内存中键入。你应该总是这样做。在这种情况下更好的理由是,只有当node是一个列表而不是你所说的元组时才会发生错误。

答案 1 :(得分:1)

如果节点是元组,我在运行代码时没有问题,正如您所指出的那样。当我将节点作为列表时,例如node = [5,5],然后我收到错误。

我认为原因是因为列表是可变的,所以它不适合检查唯一性:

   >>> a = [5,5] 
   >>> id(a) 
   140505526957552 
   >>> a.append(6) 
   >>> id(a)
   140505526957552

由于a具有相同的ID,尽管有更改,但它不能在集合中使用。

答案 2 :(得分:0)

假设node是一个列表,并且假定元组是可清除的。

closed.add(tuple(node))

答案 3 :(得分:0)

没问题 - 您确定这部分代码是什么?你可以发布追溯吗?

>>> closed = set()
>>> node = (5,5)
>>> closed.add(node)
>>> closed
set([(5, 5)])
>>> for val in closed:
...   print val
... 
(5, 5)

答案 4 :(得分:0)

您的所有节点对象都必须是可清除的,请参阅

http://docs.python.org/glossary.html#term-hashable

答案 5 :(得分:0)

您确定没有输入node = [5, 5]而不是node = (5,5)吗?看起来你的节点实际上是一个列表,它正确地拒绝向一个集合添加一个列表(因为它是不可用的)。

再次:用一些字体括号和方括号非常相似。或者堆栈包含其他数据,但您没有显示正确的节点。但你可以自己得到答案。只是做:

print type(node)

如果是列表,那么你就在这里。如果它是一个元组,那么真的很奇怪。

答案 6 :(得分:0)

您不能散列列表,因为散列必须是不可变的。 set的实现要求提高效率。由于列表的元素可以随时更新,因此从内容派生的任何哈希值也是如此。

我认为你的例子中有一个错误,因为它显示的是元组而不是列表。