2012-02-25 43 views
2
>>> import sys 
>>> print(sys.version) 
2.4.4 
>>> b = 11 
>>> def foo2(): 
... a = b 
... print a, b 
... 
>>> foo2() 
11 11 
>>> def foo3(): 
... a = b 
... b = 12 
... print a, b 
... 
>>> foo3() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 2, in foo3 
UnboundLocalError: local variable 'b' referenced before assignment 
>>> def foo4(): 
... global b 
... a = b 
... b = 12 
... print a, b 
... 
>>> foo4() 
11 12 

问题>在foo3,为什么你可以访问全局变量未声明的,但你仍然不能修改它。为什么你可以阅读但不能修改全局值?

+3

因为它是有道理这样。 – delnan 2012-02-25 19:14:45

回答

4

如果没有global声明,Python的编译器扫描每个功能的全部代码,以查看哪些变量分配给功能代码内。在foo3(),分配给两个ab等于是它们都当作函数内的局部变量。

当方法代码执行时,在你做的点a = bb还没有值(因为你还没有分配任何东西)。因此,你得到一个UnboundLocalError

这样做是为了使功能中的变量始终使用引用相同的位置,即使还没有分配给它。

+0

所以你的观点是'foo2'工作b/c'b'没有被赋值,它被当作一个可能的全局变量。 – q0987 2012-02-25 19:24:35

+1

@ q0987:正确。 Python搜索本地和全局名称空间来读取变量。 – 2012-02-25 20:21:18

3

在全局变量不小心踩是错误的常见来源。所以是有意义的声明一个变量global之前对其进行修改。

说完就始终声明非本地变量global是一种痛苦。所以如果你只是读了它,你就可以使用全局变量。但是,如果你要在你的函数的任何地方修改X,你必须做你什么它之前宣布其全球性的。

+1

也有必要指出,使用全局变量通常(但并非总是)函数内部是一个坏主意,部分原因是由于可读性和清晰性,并且经常访问/修改全局变量比仅使用局部变量要慢。 – Anorov 2012-02-25 22:10:07

相关问题