Are tuple really immutable?

Fredrik Lundh fredrik at pythonware.com
Mon Dec 27 03:46:28 EST 2004


"Chris" wrote:

> 1) Given a tuple, how can I know if it can be a dictionnary key or not?
>
> Of course I could call __hash__ and catch for a TypeError exception,
> but I'm  looking for a better way to do it.

calling hash(obj) is the only sane way to figure out if calling hash(obj)
will work.

> 2) Would it be possible to have a "ismutable" function or method?

objects are mutable only if they have some method (visible or __hidden__)
that can be used to modify their contents.  from the Python runtime perspec-
tive, objects are objects.

> 3) In this example, is t considered mutable or not?
> "Tuple are immutable" says the doc, but:
>>>> t[0].append(0)
>>>> t
> ([1, 0], [2])
>
> The tuple is immutable but its elements can be mutable: I tend to think
> that it means that the tuple is mutable. Indeed, it changed!

as map(id, t) can tell you, the tuple object itself wasn't modified.

> 4) Even more confusing: I had the following strange result:
> (with both Python 2.3.3 and 2.4)
>>>> t[0]+=[1]
> Traceback (most recent call last):
> File "<stdin>", line 1, in ?
> TypeError: object doesn't support item assignment
>>>> t
> ([1, 0, 1], [2])
> There was an exception, but the list was still changed!?

that's a silly side-effect of how "+=" is defined for lists; the "+" part of the
expression works, and modifies the target object, but the "=" part fails.

</F> 






More information about the Python-list mailing list