[docs] [issue21358] Augmented assignment doc: clarify 'only evaluated once'

Terry J. Reedy report at bugs.python.org
Sat Apr 26 22:38:59 CEST 2014


New submission from Terry J. Reedy:

https://docs.python.org/3/reference/simple_stmts.html#augmented-assignment-statements
"An augmented assignment expression like x += 1 can be rewritten as x = x + 1 to achieve a similar, but not exactly equal effect. In the augmented version, x is only evaluated once."

As discussed and demonstrated as part of #21101 (see msg 215560) and following, this is not exactly true in current CPython. If the expression 'x' is 'y[k]', then the subscription is performed twice, once to get and once to set. Both y and k are still evaluated just once.

def ob():
   print('ob fetched')
   return d

def key():
   print('key called')
   return 0

d = [[]]
ob()[key()] += [1]
print(d)

# prints
ob fetched
key called
[[1]]

I suggest changing "x is only evaluated once." to something like

"x is usually only evaluated once. However, if x has the form y[k], y and k are evaluated once but the subscription may be done twice, once to get and once to set."

I intentionally said 'subscription may be' rather than 'subscription is' because implementations should remain free to do the subscription (and the whole expression x) just once -- by directly replacing the reference to the old value in the internals of the mapping structure with a reference to the new value.

#16701 discusses possible ambiguity in the next sentence, about 'in place'.

----------
assignee: docs at python
components: Documentation
messages: 217212
nosy: docs at python, terry.reedy
priority: normal
severity: normal
stage: needs patch
status: open
title: Augmented assignment doc: clarify 'only evaluated once'
type: enhancement
versions: Python 2.7, Python 3.4, Python 3.5

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue21358>
_______________________________________


More information about the docs mailing list