在Python中(测试版本为2.7.6),所有变量都在编译时静态绑定到作用域。这个过程在http://www.python.org/dev/peps/pep-0227/和http://docs.python.org/2.7/reference/executionmodel.html中有详细说明。
其中明确指出:“如果名称绑定操作在代码块内的任何地方发生,则块内所有对该名称的使用都被视为对当前块的引用。”
函数是一个代码块,因此下面的代码将失败,因为
作为类定义是一个代码块,此块内的任何赋值操作都应该使得变量成为局部变量。因此,
其中明确指出:“如果名称绑定操作在代码块内的任何地方发生,则块内所有对该名称的使用都被视为对当前块的引用。”
函数是一个代码块,因此下面的代码将失败,因为
x
在使用后进行了赋值(因此在编译时它被定义为局部变量,但在执行时,在绑定之前使用) 。x = 1
def f():
print x
x = 2
print x
>>> f()
Traceback (most recent call last):
File "<pyshell#46>", line 1, in <module>
f()
File "<pyshell#45>", line 2, in f
print x
UnboundLocalError: local variable 'x' referenced before assignment
一个类也是一个代码块,因此我们应该观察完全相同的行为。但这不是我所观察到的。 看这个例子:
x = 1
class C():
y = x + 10
x = 2
def __init__(self):
print C.y
>>> C.x
2
>>> C.y
11
>>> C()
11
<__main__.C instance at 0x00000000027CC9C8>
作为类定义是一个代码块,此块内的任何赋值操作都应该使得变量成为局部变量。因此,
x
应该是类 C
的局部变量,那么 y = x + 10
应该会导致一个 UnboundLocalError
错误。为什么没有出现这样的错误呢?
<function f at 0x1092a80c8>
和<class __main__.C at 0x1092946d0>
。区别在于__main__
名称空间。 - VooDooNOFX