Python镜

Python scope

本问题已经有最佳答案,请猛点这里访问。

我想弄清楚:

1
2
3
4
5
6
7
8
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语句:

1
2
3
def g(n):
    global c
    c = c + n

这是Python的一个奇怪的地方,它从来没有真正适合我。


全球国家是需要避免的,特别是需要改变它。考虑如果g()只应采用两个参数,或者f()g()需要是具有c实例属性的公共类的方法

1
2
3
4
5
6
7
8
9
10
11
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)

输出:

1
2
2
3


格雷格职位勘误表:

在引用它们之前应该没有。看一看:ZZU1〔3〕

它会爆炸,即使在引用后指定了X。在python中,变量可以是本地变量或引用外部范围,并且不能在一个函数中更改。


除了greg所说的,在python3.0中,还有一个非本地语句来声明"这里有一些在封闭范围中定义的名称"。与全局名称不同,这些名称必须已经在当前范围之外定义。很容易找到名称和变量。现在你不能确定"全球某物"到底是在哪里定义的。