类定义中的变量作用域令人困惑

时间:2018-12-23 19:36:25

标签: python python-3.x python-2.7 scope namespaces

由于某些原因,当发生这种情况时python从全局名称空间获取变量:

class Cls:
    foo = foo

请查看以下代码:

foo = 'global'

def func0():
    foo = 'local'
    class Cls:
        bar = foo
    print('func0', Cls.bar)
 func0()
 # func0 local

def func1():
    foo = 'local'
    class Cls:
        foo = foo
    print('func1', Cls.foo)
func1()
# func1 global

def func2():
    foo = 'nonlocal'
    def internal():
        class Cls:
            foo = foo
        print('func2.internal', Cls.foo)
    internal()
func2()
# func2.internal global

def func3():
    foo = 'local'
    class Cls:
        bar = foo
        foo = foo
    print('func3', Cls.bar, Cls.foo)
func3()
# func3 global global

符合PEP 227

  

类定义是可执行的语句,可能包含名称的使用和定义。这些参考遵循名称解析的常规规则。类定义的名称空间成为该类的属性字典。

但对我来说,它根本不像是“遵循正常规则”。我想念什么?

Py2和Py3都以这种方式工作。

1 个答案:

答案 0 :(得分:6)

Execution model - Resolution of names中有记录:

  

类定义块[...]很特殊   在名称解析中。类定义是可执行文件   可以使用和定义名称的语句。这些参考文献遵循   名称解析的常规规则,但未绑定本地   在全局命名空间中查找变量。

(重点是我的)