类定义块的名称解析和exec()和eval()的参数

时间:2017-07-13 01:29:44

标签: python python-3.x

来自https://docs.python.org/3/reference/executionmodel.html#resolution-of-names

  

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

在全局命名空间中查找“未绑定的局部变量”是什么意思?类定义是否可以在另一个类定义或函数定义中,以便未绑定的局部变量的查找不在全局命名空间中,而是在本地嵌套范围内?

什么是“正常规则”?

感谢。

1 个答案:

答案 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,因为xBar 1}}不再是本地的(它是免费变量),并在最近的封闭范围内查找。

此外,在本地命名空间中查找未绑定本地的规则适用于类,但不适用于函数。让我们尝试一下这个函数:

x = 1
def foo():
    x = 2
    def bar():
        print(x)
        x = 3
    bar()
foo()
# Raises: UnboundLocalError: local variable 'x' referenced before assignment

正如您所看到的,在功能中,您无需在为其分配值之前使用本地。