为什么在局部类定义中的`print`语句之后分配给变量会改变打印值?
为什么这个函数输出0 1?
为什么函数中的类表现得像函数?为什么我不必像函数一样调用 A ?
如何赋值语句后,print()影响的值x和y?当我为 赋值时x,x变为 0,如果我为 赋值y,则y变为 0。
x = 0
y = 0
def f():
x = 1
y = 1
class A:
print(x,y)
x = 99
f()
回答
来自 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.