开发者

error: list objects are unhashable

 closed = set() -here closed is a set

node is (5,5)

The error occurse at execution time.

Error is:

list objects are unhashable

the program is:

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

Node is the output of stack.

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

Traceback:

开发者_如何学运维
File "/home/", line 99, in depthFirstSearch
    closed.add(node)
TypeError: list objects are unhashable


Show the actual code that you executed, plus the full traceback. Use copy/paste, don't type from memory. You should always do this. Even better reason in this case is that that error can happen only if node is a list, not a tuple as you have said.


I do not have a problem running the code if node is a tuple, as you indicate. When I make node a list, e.g., node = [5,5], then I receive the error.

I believe the reason is because a list is mutable, so it is not suitable for checking for uniqueness:

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

Since a has the same id despite the change, it cannot be used in a set.


Assuming node is a list, and given that tuples are hashable.

closed.add(tuple(node))


No problem with that - are you sure it is this portion of code? Can you post the traceback?

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


All your node object have to be hashable, see

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


You can't hash a list because hashes must be immutable. The implementation of set requires this for efficiency. Since the elements of a list can be updated at any time, so would any hash value derived from the contents.

I think there's a mistake in your example, as it shows a tuple rather than a list.


Are you sure you didn't typed node = [5, 5] instead of node = (5,5) ? Looks like you node is really a list and it rightly refuse to add a list to a set (as it is unhashable).

Again: with some fonts parenthesis and square brackets are very similar. Or stacks contains other data and you didn't showed the right node. But you can get the answer by yourself. Just do:

print type(node)

If it is a list you are here. If it is a tuple, something really weird occurred.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜