[Python-Dev] [Python-checkins] cpython (3.3): #17973: Add FAQ entry for ([], )[0] += [1] both extending and raising.
Nick Coghlan
ncoghlan at gmail.com
Tue May 21 15:24:17 CEST 2013
On Tue, May 21, 2013 at 12:35 AM, r.david.murray
<python-checkins at python.org> wrote:
Yay for having this in the FAQ, but...
> +If you wrote::
> +
> + >>> a_tuple = (1, 2)
> + >>> a_tuple[0] += 1
> + Traceback (most recent call last):
> + ...
> + TypeError: 'tuple' object does not support item assignment
> +
> +The reason for the exception should be immediately clear: ``1`` is added to the
> +object ``a_tuple[0]`` points to (``1``), producing the result object, ``2``,
> +but when we attempt to assign the result of the computation, ``2``, to element
> +``0`` of the tuple, we get an error because we can't change what an element of
> +a tuple points to.
> +
> +Under the covers, what this augmented assignment statement is doing is
> +approximately this::
> +
> + >>> result = a_tuple[0].__iadd__(1)
> + >>> a_tuple[0] = result
> + Traceback (most recent call last):
> + ...
> + TypeError: 'tuple' object does not support item assignment
For the immutable case, this expansion is incorrect:
>>> hasattr(0, "__iadd__")
False
With immutable objects, += almost always expands to:
>>> result = a_tuple[0] + 1
>>> a_tuple[0] = result
(For containers that support binary operators, the presence of the
relevant __i*__ methods is actually a reasonable heuristic for
distinguishing the mutable and immutable versions)
Cheers,
Nick.
--
Nick Coghlan | ncoghlan at gmail.com | Brisbane, Australia
More information about the Python-Dev
mailing list