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
答案 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)
您的所有节点对象都必须是可清除的,请参阅
答案 5 :(得分:0)
您确定没有输入node = [5, 5]
而不是node = (5,5)
吗?看起来你的节点实际上是一个列表,它正确地拒绝向一个集合添加一个列表(因为它是不可用的)。
再次:用一些字体括号和方括号非常相似。或者堆栈包含其他数据,但您没有显示正确的节点。但你可以自己得到答案。只是做:
print type(node)
如果是列表,那么你就在这里。如果它是一个元组,那么真的很奇怪。
答案 6 :(得分:0)
您不能散列列表,因为散列必须是不可变的。 set的实现要求提高效率。由于列表的元素可以随时更新,因此从内容派生的任何哈希值也是如此。
我认为你的例子中有一个错误,因为它显示的是元组而不是列表。