[Python-ideas] Why does += trigger UnboundLocalError?

Georg Brandl g.brandl at gmx.net
Wed Jun 1 09:05:58 CEST 2011

On 01.06.2011 08:48, Carl M. Johnson wrote:
> On Tue, May 31, 2011 at 7:48 PM, Georg Brandl
> <g.brandl at gmx.net
> <mailto:g.brandl at gmx.net>> wrote:
>     Because x += y is equivalent to
>     x = x.__iadd__(y)
>     and therefore an assignment is going on here.  Therefore, it's only logical to
>     treat it as such when determining scopes.
> But the difference is that you can only use += if the LHS name already exists
> and is defined. So, it couldn't possibly be referring to a local name if it's
> the only assignment-like statement within a function body. How could it refer to
> a local if it has to refer to something that already exists?

Sure, this can only work if the local is assigned somewhere before the augmented
assign statement.  But this is just like accessing a local before its
assignment: in the case of

x = 1
def f():
    print x
    x = 2

we also don't treat the first "x" reference as a nonlocal.

And the fact remains that augassign *is* an assignment, and the rule is that
assignments to out-of-scope names are only allowed when declared using "global"
or "nonlocal".


More information about the Python-ideas mailing list