Python作用域:“UnboundLocalError: 在赋值前引用了局部变量'c'”

41 投票
4 回答
19496 浏览
提问于 2025-04-11 09:19

我正在尝试弄明白这个:

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中我一直觉得有点奇怪的地方。

撰写回答