41

我试图弄清楚这一点:

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

4 回答 4

52

在函数中,分配给的变量默认被视为局部变量。要分配给全局变量,请使用以下global语句:

def g(n):
    global c
    c = c + n

这是 Python 中从未真正让我满意的古怪领域之一。

于 2008-09-28T18:02:54.260 回答
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
于 2008-09-28T19:33:23.497 回答
9

Greg 帖子的勘误表:

在它们被引用之前应该没有。看一看:

x = 1
def explode():
    print x # raises UnboundLocalError here
    x = 2

它会爆炸,即使 x 在被引用后被分配。在 Python 中,变量可以是本地的,也可以是外部范围的,并且不能在一个函数中更改。

于 2008-09-29T20:42:21.387 回答
2

除了 Greg 所说的,在 Python 3.0 中,将有一条非本地语句来声明“这里有一些在封闭范围内定义的名称”。与全局不同,这些名称必须已经在当前范围之外定义。追踪名称和变量将很容易。如今,您无法确定“全局变量”的确切定义在哪里。

于 2008-09-28T19:39:13.000 回答