+= 运算符有什么特别之处?
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)
我写了一个类似于下面的代码,它给了我 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)