In article <50aac66c$0$29983$c3e8da3$54964...@news.astraweb.com>, Steven D'Aprano <steve+comp.lang.pyt...@pearwood.info> wrote:
> I'm asking about the case where one might want the key to remain mutable > even after it is used as a key, but can't because Python won't let you. Ah. Now I see what you're getting at. Thank you. Well, I will admit that it probably doesn't make sense to mutate an object after it's put into a dict (or at least mutate it in a way which changes it's hash value and/or whether it compares equal to the original object). If you did (assuming lists were allowed as keys): l = [1, 2, 3] d = {l: "spam"} l.append(4) print d[l] I'm not sure what I would expect to print. It's not too hard to experiment, though. All you need do is: class HashableList(list): def __hash__(self): return hash(tuple(self)) and python is then happy to let you use a list as a key. I just played around with this a bit off-line. I think I got the results I was expecting, but since I'm not sure what I was expecting, that's hard to say. However, you didn't ask if it made sense to mutate an object after using it as a key. You asked if it made sense to let the object remain mutable after using it as a key. That's a harder question. Let's say I had lots of of lists I wanted to use a dictionary keys. As it stands now, I have to convert them to tuples, which means copying all the data. For a lot of data, that's inefficient. Wouldn't it be nice (or at least, more efficient) if I could just use the original lists as keys directly, without the extra copy? I would have to understand that even though they are mutable, interesting (and perhaps, unwanted) things if I actually mutated them. But, we're all consenting adults here. If I'm willing to accept responsibility for the consequences of my actions in return for the efficiency gain, why shouldn't I be allowed to? I guess the answer is, that I am allowed to. I just need to do the HashableList deal, shown above (no broken URL required to read the code). -- http://mail.python.org/mailman/listinfo/python-list