为什么静态绑定对类和函数的工作方式不同?
在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
。 为什么没有这样的错误?
是的 - 看起来文件相当具有误导性。 类定义实际上并不像其他常规块那样工作:
global_one = 0
class A(object):
x = global_one + 10
global_one = 100
y = global_one + 20
del global_one
z = global_one + 30
a = A()
print a.x, a.y, a.z, global_one
结果为: 10, 120, 30, 0
如果你尝试用一个函数同样的事情,你会得到一个UnboundLocalError
在你的第一次访问global_one
。
原因在于类的定义与普通类一样有权访问父范围,但是,所有名称分配都不会修改本地范围,但实际上会将其捕获到类的数据属性字典中。 文档中有关于此的提示,但它肯定不是很明显。
链接地址: http://www.djcxy.com/p/17379.html上一篇: Why static binding works differently for class and function?