python:名称解析澄清?

blu*_*ote 4 python

我正在阅读 python 参考名称解析,它读取

类定义是可以使用和定义名称的可执行语句。这些引用遵循名称解析的正常规则,例外是在全局命名空间中查找未绑定的局部变量。

基于此,我希望以下代码

x = 10

def f():
    x = 5

    class Test:
        y = x

    return Test

print(f().y)
Run Code Online (Sandbox Code Playgroud)

打印10,但它打印5。这是参考文献中的错误,还是我误解了什么?

Thi*_*lle 5

在这种情况下,“正常”规则适用:

x = 'global'

def f():
    x = 'defined in f'

    class Test:
        print(x) # not local, normal rules apply

f()
# defined in f
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,UnboundLocalError: local variable 'x' referenced before assignment如果我们在函数内部,我们会期望一个:

x = 'global'

def f():
    x = 'defined in f'

    class Test:
        print(x) # unbound local at this time
        x = 'assigned in Test'
        print(x)
Run Code Online (Sandbox Code Playgroud)

但是对于第一个print(x),x将从全局命名空间中获取:

f()
# global
# assigned in Test
Run Code Online (Sandbox Code Playgroud)