为什么分配给与本地变量同名的类属性会引发NameError?

Ara*_*Fey 5 python attributes class function

考虑这个类定义:

def func():
    x = 5

    class Foo:
        x = x

func()
Run Code Online (Sandbox Code Playgroud)

我希望这创建一个属性x设置为5的类 - 但它会抛出一个NameError:

Traceback (most recent call last):
  File "untitled.py", line 7, in <module>
    func()
  File "untitled.py", line 4, in func
    class Foo:
  File "untitled.py", line 5, in Foo
    x = x
NameError: name 'x' is not defined
Run Code Online (Sandbox Code Playgroud)

但是,该错误仅在函数内部引发,并且仅在x局部变量时才会引发.所有这些片段都可以正常工作:

x = 5

class Foo:
    x = x
Run Code Online (Sandbox Code Playgroud)
x = 5

def func():
    class Foo:
        x = x

func()
Run Code Online (Sandbox Code Playgroud)
class Bar:
    x = 5

    class Foo:
        x = x
Run Code Online (Sandbox Code Playgroud)
def func():
    x = 5

    class Foo:
        y = x

func()
Run Code Online (Sandbox Code Playgroud)

是什么导致了这种奇怪的行为?

blh*_*ing 1

因为Python编译器在确定哪些变量是局部变量时会查看代码块中的所有左值。由于在有问题的代码中,x被用作块中的左值class,因此它被视为该class块的本地变量,因此,它被认为在被赋值之前被引用,因此出现异常。