New submission from Marek Scholle <mscho...@purestorage.com>:

Hi, I ran into discussion about scoping in Python (visibility of outer 
variables in nested functions, global, nonlocal) which made me to create for 
other some showcases.

I realized there is a space for ambiguity which I extracted to this REPL:

----
>>> x = []
>>> def f(): x += [1]
...
>>> f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in f
UnboundLocalError: local variable 'x' referenced before assignment
>>> x = []
>>> def f(): x.append(1)
...
>>> f()
>>> x
[1]
----

The documentation says about `x += [1]` it is "translated" to 
`x.__iadd__([1])`. It would be interesting to know if Python actually documents 
that `x += [1]` will err with `UnboundLocalError`.

I think there is a natural argument that `x += <rhs>` should behave as an 
in-place version of `x = x + <rhs>` (where `UnboundLocalError` makes perfect 
sense), but diving into documentation it seems that `x += <rhs>` should be a 
syntax sugar for `x.__iadd__(rhs)` in which case `UnboundLocalError` should not 
happen and looks like some parser artifact.

----------
components: Interpreter Core
messages: 412365
nosy: mscholle
priority: normal
severity: normal
status: open
title: Unclear behavior of += operator
type: behavior
versions: Python 3.9

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue46612>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to