您在这里看到的是访问变量和分配变量之间的区别。在Python 2.x中,您只能分配给最内部作用域或全局作用域的变量(后者是通过使用global语句完成的)。您可以在任何封闭范围内访问变量,但不能在封闭范围内访问变量,然后在最内部或全局范围内对其进行分配。
这意味着如果在函数内部对名称进行了任何分配,则在访问名称之前,必须已经在最内部的作用域中定义了该名称(除非使用了全局语句)。在您的代码中,该行c += 3
基本上等同于以下内容:
tmp = c
c = tmp + 3
由于c
函数中有分配给,因此该函数中的。这就是为什么您看到错误的原因,您试图访问c
以获取其的当前值+=
,但c
尚未定义本地范围。
在Python 3中,您可以通过使用nonlocal语句解决此问题,该语句允许您将变量分配给不在当前范围内但也不在全局范围内的变量。
您的代码看起来像这样,在顶部的类似行funcC
:
def funcB():
nonlocal c
c += 3
...
在Python 2.x中,这不是选项,更改非局部变量值的唯一方法是可变。
最简单的方法是将您的值包装在一个列表中,然后在您之前刚刚使用变量名称的每个位置修改和访问该列表的第一个元素:
def funcA():
print "funcA"
c = [0]
def funcB():
c[0] += 3
print "funcB", c[0]
def funcC():
c[0] = 5
print "funcC", c[0]
print "c", c[0]
funcB()
funcC()
funcB()
funcC()
print "end"
funcA()
…以及输出:
funcA
c 0
funcB 3
funcC 5
funcB 8
funcC 5
end