2015-05-29 75 views
-4

我对Python的变量范围系统如何工作有点困惑。说我有这样的情况:Python变量范围的意外行为

a = 10 
def test(): 
    print(a) 

然后,一切正常,如我所料。 Python首先查找本地变量a,但未能找到它,然后搜索全局变量。

然而,在这样的情况下:

a = 10 
def test(): 
    print(a) 
    a += 1 
    print(a) 

的Python抛出UnboundLocalError例外,从第3行(print(a))显然始发。对我来说,似乎至少在这一行没有任何改变,我不明白为什么有一个例外。

+1

请发布 – therealprashant

+2

@therealprashant之前正常搜索说谁回答这一个。 – vaultah

+0

@vaultah有时候确实遇到了一些需要被回答的固执的人:) – therealprashant

回答

0

这是因为,当你对一个(它预计是全局的)做一些操作时,python会像本地一样对待它。

所以,当你做一个+ = 1它搜索局部变量,它不会找到任何,因此错误。

如果您尝试增加全局a,那么您需要在此之前提及一个全局关键字。否则使用一些其他的变量,并增加它

你也可以看看:UnboundLocalError: local variable 'L' referenced before assignment Python

考虑这个

c = 0 

def increment(): 
    print c 
    c += 1 

increment() 

,如果有一个分配给一个函数内部的变量,该变量被认为是局部因此,行

c += 1 

隐式使计数器本地增加()。 所以打印C的温度将搜索本地变量C而不是全局变量c 我希望这很好,现在

+1

但是,这仍然不能解释为什么异常来自第3行 – Parzival

+0

@Parzival如果你仔细看,那么你会的原因 – therealprashant

0

因为Python没有变量声明,函数的范围内的每个变量赋值被认为是本地的。所以,你总是要指定变量是全球性的:

a = 10 
def test(): 
    global a 
    print(a) 
    a += 1 
    print(a) 
test() 
+0

推荐使用'global'是一个坏主意。 – Matthias