Peter Maas wrote:
This strikes me because if one can do this with instances of user
defined classes why not with lists? Trying to use lists as dict
keys yields "TypeError: list objects are unhashable". So why are
list objects unhashable and user defined objects hashable? For
user defined objects hash(x1) = id(x1), why not do the same
with lists?

I think it's because of the existence of list literals. If you
would use id() as a hash function for lists how should d[[1,2,3]]
be stored? For instances of user defined classes there is no
literal and accordingly no problem to use id() as a hash function
and instances as dictionary keys.

Is that correct?

Well, there's no problem getting an id of a list without a name if that's what you mean:


py> lst = [[1,2,3]]
py> id(lst[0])
12456424

If lists were hashable, new programmers to Python would almost certainly make mistakes like:

py> d = {[1, 2, 3]: 'abc'}

The coder here almost certainly *doesn't* want that list to be compared by id. The only way to get a binding for that list would be using the dict's keys or __iter__ methods.

The coder here almost certainly wants to compare by value so that the following code works:

py> d[[1, 2, 3]]

Of course, this is what tuples are for -- Python even supports special syntax for using them this way:

py> d[1, 2, 3]

So my suspicion is that lists are not hashable because it prevents what would be a very easy mistake to make. Yes, it means you can't use your lists as keys to a dict, but how often do you want to do that anyway? I don't think I've ever wanted to do that. If I ever do, I'll probably just do something like:

py> lst1, lst2 = [1, 2, 3], 'a b c'.split()
py> d = {id(lst1):100, id(lst2):200}
py> d[id(lst1)]
100
py> d[id(lst2)]
200

Certainly I don't mind having to be explicit for an unusual case if it saves me a little trouble for the more common cases.

Steve
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to