python - 为什么静态绑定(bind)对类和函数的作用不同?

标签 python class scope static-binding

在 python 中(在 2.7.6 上测试)所有变量都是 在编译时静态绑定(bind)到一个范围。这个过程很好 在 http://www.python.org/dev/peps/pep-0227/ 中描述和 http://docs.python.org/2.7/reference/executionmodel.html

明确指出“如果发生名称绑定(bind)操作 代码块中的任何位置, block 中名称的所有使用 被视为对当前 block 的引用。”

函数是一个代码块,所以下面的代码会失败,因为 x 在使用后分配(因此在编译时它被定义为本地 因为它是在函数的某处分配的,但是在执行时 时间,它在被绑定(bind)之前使用)。

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>

由于类定义是一个代码块,在此范围内的任何赋值 block 应该使变量本地化。所以 x 应该是本地的 类 C,因此 y = x + 10 应该导致 UnboundLocalError。 为什么没有这样的错误?

最佳答案

是的 - 文档似乎具有误导性。类定义实际上并不像其他普通 block 那样工作:

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

如果您对一个函数尝试同样的事情,您会在第一次访问 global_one 时得到一个 UnboundLocalError

原因是类定义通常可以访问父范围,但是,所有名称分配都不会修改本地范围,但实际上会被捕获到类的数据属性字典中。文档中有关于此的提示,但肯定不是很明显。

关于python - 为什么静态绑定(bind)对类和函数的作用不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20148256/

相关文章:

python - 无法在 Windows 7 上使用 Google Native Client SDK

Python 多处理负载均衡器

python - 如何在 Python 中实现 Schwartzian 变换?

c++ - 在 C++ 中的一些其他指令之后调用基类的构造函数

c++ - 如何在一元谓词中使用类成员变量?

perl - Perl 变量作用域在严格模式下的 while 循环中如何工作?

Python编程-从Excel工作表中查找无效记录

delphi - 匿名方法的范围

ios - 在Objective-C中构建和返回对象的这种方式的iOS名称

html - animate.css 仅在您的屏幕看到元素 ID 时生效