类定义中的变量范围令人困惑

min*_*leg 5 python scope namespaces python-2.7 python-3.x

出于某些原因,当出现这样的情况时,python从全局命名空间中获取变量:

class Cls:
    foo = foo
Run Code Online (Sandbox Code Playgroud)

请看这段代码:

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
Run Code Online (Sandbox Code Playgroud)

按照PEP 227

类定义是可执行语句,可以包含名称的用法和定义.这些引用遵循名称解析的常规规则.类定义的名称空间成为类的属性字典.

但对我来说,它看起来并不像"遵循正常规则".我错过了什么?

Py2和Py3都以这种方式运行.

Thi*_*lle 6

执行模型中记录了这一点- 名称解析:

类定义块[...]在名称解析的上下文中是特殊的.类定义是可以使用和定义名称的可执行语句.这些引用遵循名称解析的常规规则,但在全局命名空间中查找未绑定的局部 变量.

(强调我的)