来自https://docs.python.org/3/reference/executionmodel.html#resolution-of-names
类定义是可以使用和定义的可执行语句 名。这些引用遵循名称的正常规则 除未绑定的局部变量之外的分辨率 在全局命名空间中查找。
在全局命名空间中查找“未绑定的局部变量”是什么意思?类定义是否可以在另一个类定义或函数定义中,以便未绑定的局部变量的查找不在全局命名空间中,而是在本地嵌套范围内?
什么是“正常规则”?
感谢。
答案 0 :(得分:1)
举个例子:
x = 1
def foo():
x = 2
class Bar:
print(x)
x = 3
foo()
# Output: 1
当print()
被调用时,x
是本地的(因为它已在下一行中分配),但仍然未绑定,因为它已在分配之前使用价值。
您可能希望在最近的命名空间(可能是x
)中查找未绑定的2
,但在类块中,"查找未绑定的本地变量在全局命名空间" 中,查找全局x
并打印1
。
让我们删除Bar
中的作业:
x = 1
def foo():
x = 2
class Bar:
print(x)
foo()
# Output: 2
现在我们正在遵循"正常的名称解析规则" 并获得输出2
,因为x
内Bar
1}}不再是本地的(它是免费变量),并在最近的封闭范围内查找。
此外,在本地命名空间中查找未绑定本地的规则适用于类,但不适用于函数。让我们尝试一下这个函数:
x = 1
def foo():
x = 2
def bar():
print(x)
x = 3
bar()
foo()
# Raises: UnboundLocalError: local variable 'x' referenced before assignment
正如您所看到的,在功能中,您无需在为其分配值之前使用本地。