Relax Syntax for Augmented Arithmetic?

Aahz aahz at pythoncraft.com
Fri Jan 23 04:22:08 CET 2009


In article <87hc3un1vn.fsf.mdw at metalzone.distorted.org.uk>,
Mark Wooding  <mdw at distorted.org.uk> wrote:
>
>  * Python augmented-assignment (`+=', for example) is inconsistent.
>    Depending on what type of object the left-hand side evaluates to, it
>    may /either/ mutate that object, /or/ assign a new value to the
>    expression.

Actually, that is not correct.  The augmented assignment always binds a
new value to the name; the gotcha is that with a mutable object, the
object returns ``self`` from the augmented assignment method rather than
creating a new object and returning that.  IOW, the smarts are always
with the object, not with the augmented assignment bytecode.

The best way to illustrate this:

>>> a = (1, ['foo'], 'xyzzy')
>>> a[1].append('bar')
>>> a
(1, ['foo', 'bar'], 'xyzzy')
>>> a[1] = 9
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: object doesn't support item assignment
>>> a
(1, ['foo', 'bar'], 'xyzzy')
>>> a[1] += ['spam']
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: object doesn't support item assignment
>>> a
(1, ['foo', 'bar', 'spam'], 'xyzzy')
-- 
Aahz (aahz at pythoncraft.com)           <*>         http://www.pythoncraft.com/

Weinberg's Second Law: If builders built buildings the way programmers wrote 
programs, then the first woodpecker that came along would destroy civilization.



More information about the Python-list mailing list