Tuple question

Roy Smith roy at panix.com
Sun Sep 5 08:20:08 EDT 2004


"Donn Cave" <donn at drizzle.com> wrote:
> I expect it's used relatively infrequently, and for different
> reasons.  "if len(info) == 5", for example - just from that
> line from a relatively popular Python application, would you
> guess info is a list, or a tuple?

I'd guess it was something which had a __len__ method.

> Maybe the problem is that tuples have too many features already.
> It's sort of silly that they're indexed by number, and if that
> weren't allowed, we would find fewer people trying to make lists
> of them.

If tuples weren't indexed, the only way you'd be able to access the 
elements would be to unpack them, which would be rather inconvenient.  
Unless of course you had an alternate way to name the elements, but if 
you're going to allow named element access, and forbid indexed access, 
then you might as well just create a normal class instance.

The more I look into this, the more I realize just how inconsistent the 
whole thing is.

For example, tuples can be used as dictionary keys because they are 
immutable.  Or so it's commonly said.  But, that's not true.  The real 
reason they can be used as keys is because they're hashable.  If you try 
to use a list as a key, it doesn't complain that it's immutable, it 
complains that it's unhashable:

>>> d = {}
>>> d[[1, 2]] = 3
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: list objects are unhashable

Furthermore, regular objects can be used as keys, even though they *are* 
mutable.  You can do this:

class data:
    pass

key = data ()
key.x = 1
key.y = 2

d = {}
d[key] = None

dictKey = d.keys()[0]
print dictKey.x, dictKey.y

key.x = 42
dictKey = d.keys()[0]
print dictKey.x, dictKey.y

If a mutable class instance object can be used as a dictionary key, then 
I don't really see any reason a list shouldn't be usable as a key.  How 
is a class instance's mutability any less of disqualifier for key-ness 
than a list's mutability?

And, once you allow lists to be keys, then pretty much the whole raison 
d'etre for tuples goes away.  And if we didn't have tuples, then we 
wouldn't have to worry about silly syntax warts like t = (1,) to make a 
1-tuple :-)



More information about the Python-list mailing list