On 01.05.2010 14:13, * Tim Chase:
On 05/01/2010 12:08 AM, Patrick Maupin wrote:
+=, -=, /=, *=, etc. conceptually (and, if lhs object supports in-
place operator methods, actually) *modify* the lhs object.

Your proposed .= syntax conceptually *replaces* the lhs object
(actually, rebinds the lhs symbol to the new object).

The += family of operators really do rebind the symbol, not modify the
object.

 >>> from decimal import Decimal
 >>> d = Decimal(42)
 >>> e = Decimal(18)
 >>> orig = d
 >>> d += e
 >>> d
Decimal("60")
 >>> e
Decimal("18")
 >>> orig
Decimal("42")
 >>> d is orig
False

If your suggestion that += *modifies* the object, then orig would now
unintuitively contain 60 and "d is orig" would return True.

In some cases += modifies the object. For CPython this is an optimization for the 'str' type, reducing to O(n) time the common newbie O(n^2) loops. The criterion for doing it is that there is exactly 1 reference (as is the case after a first append, subsequent appends can just modify).


This doesn't preclude you from implementing a self-mutating += style
__add__ method and returning "self", but it's usually a bad idea unless
it's dire for performance (and even then, think it over a couple times).

Agreed, at the Python level one doesn't in general have the necessary information to do it safely. Nothwithstanding the current CPython and Jython documentation error of sys.getrefcount (or whatever the name was) that indicates that it's available in any implementation.


Cheers,

- Alf
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to