On Sun, Feb 23, 2014 at 3:06 PM, Sam <lightai...@gmail.com> wrote: > My understanding of Python tuples is that they are like immutable lists. If > this is the cause, why can't we replace tuples with lists all the time (just > don't reassign the lists)? Correct me if I am wrong. >
One reason is performance/efficiency. If Python knows this is never going to change, it can save some effort. But a more important reason is hashability. >>> mapping = {} >>> key = (1,2) >>> mapping[key] = "Hello" >>> key = (1,3) >>> mapping[key] = "World" >>> key = (2,3) >>> mapping[key] = "!" >>> mapping {(1, 2): 'Hello', (1, 3): 'World', (2, 3): '!'} You can't do this with lists: >>> key = [1,2] >>> mapping[key] Traceback (most recent call last): File "<pyshell#12>", line 1, in <module> mapping[key] TypeError: unhashable type: 'list' This is because any two tuples are either equal or not equal, they can't be otherwise. I can create another tuple and look up something in the above mapping: >>> mapping[1,3] 'World' But with lists, their equality can change. >>> lst1 = [1,2] >>> lst2 = [1,3] >>> lst1 == lst2 False >>> lst1[1] += 1 >>> lst1 == lst2 True >>> lst1[1] += 1 >>> lst1 == lst2 False So it would be very difficult and dangerous to try to use a list as a dictionary key. The only safe way to do it is by identity, and that's only useful in a very small set of situations. So Python happily declares that a tuple can be a dict key and a list can't, and that's now a key (if you'll excuse the pun) difference between them. ChrisA -- https://mail.python.org/mailman/listinfo/python-list