+= 运算符有什么特别之处?

What is so special about += operator?

我写了一个类似于下面的代码,它给了我 local variable 'a' referenced before assignment 错误。当我将 a += [2] 更改为 a.append(2) 时,它起作用了。

def f():
   a = [1]
   def f1():
      a += [2] # => no error with a.append(2)
   f1()
   print(a)

为什么?为什么解析器无法识别外面的 a+=?

这是给 a 的作业。它基本上是

的语法糖
a = a.__iadd__([2])

生成代码时赋值使 a 成为局部变量,但随后赋值的 RHS 尝试在运行时定义该变量之前访问该变量。

另一方面,

a.append(2) 不是 赋值。 a 是一个自由变量,其值取自最近的封闭范围。

如果要赋值给非局部变量,需要先声明名称为非局部

def f():
   a = [1]
   def f1():
      nonlocal a
      a += [2]
   f1()
   print(a)