Python范围

时间:2020-03-06 14:50:57  来源:igfitidea点击:

我试图找出这一点:

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

谢谢!

解决方案

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

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

这是Python的一个古怪领域之一,从来没有真正让我满意。

全局状态是要避免的东西,尤其是需要对其进行突变的东西。考虑" 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

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

格雷格(Greg)的勘误表:

在引用它们之前应该没有任何内容。看一看:
`

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

`

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