Python作用域:“UnboundLocalError: 在赋值前引用了局部变量'c'”
我正在尝试弄明白这个:
c = 1
def f(n):
print c + n
def g(n):
c = c + n
f(1) # => 2
g(1) # => UnboundLocalError: local variable 'c' referenced before assignment
谢谢!
4 个回答
9
关于Greg的帖子的更正:
这里不应该有在被引用之前。看看这个例子:
x = 1
def explode():
print x # raises UnboundLocalError here
x = 2
即使在引用之后给x赋值,它也会出错。在Python中,变量可以是局部的,也可以引用外部的作用域,而且在一个函数内部是不能改变的。
12
全局状态是我们应该尽量避免的,尤其是当我们需要改变它的时候。想想看,g()
是不是应该直接接收两个参数,或者 f()
和 g()
是否应该是同一个类的方法,而 c
是这个类的一个实例属性。
class A:
c = 1
def f(self, n):
print self.c + n
def g(self, n):
self.c += n
a = A()
a.f(1)
a.g(1)
a.f(1)
输出结果:
2
3
52
在一个函数里,默认情况下,赋值的变量会被当作局部变量。要想给全局变量赋值,可以使用 global
这个关键词:
def g(n):
global c
c = c + n
这是Python中我一直觉得有点奇怪的地方。