为什么在局部类定义中的 `print` 语句之后分配给变量会改变打印值?

Hus*_*ema 6 python python-3.x

为什么这个函数输出0 1

为什么函数中的类表现得像函数?为什么我不必像函数一样调用 A ?

如何赋值语句后,print()影响的值xy?当我为 赋值时xx变为 0,如果我为 赋值y,则y变为 0。

x = 0
y = 0

def f():
  x = 1
  y = 1
  class A:
    print(x,y)
    x = 99

f()
Run Code Online (Sandbox Code Playgroud)

Roo*_*Two 6

来自 Python 3.9文档

如果名称绑定操作发生在代码块内的任何位置,则块内对该名称的所有使用都被视为对当前块的引用。

该生产线x = 99在类定义,使x本地的类块。

在一个类块中,

引用遵循名称解析的正常规则,例外是在全局命名空间中查找未绑定的局部变量。

print(x,y)执行时,x是一个未绑定的局部变量。它的值在全局命名空间中查找,其中x = 0.

在代码块中使用名称时,将使用最近的封闭范围对其进行解析。

print(x, y)被执行时,的值y在最近的封闭范围,这是身体抬头def f(),其中y = 1

所以print(x, y)输出0 1.