Python exec()和eval()的类定义块和参数的名称解析
从 类定义是可以使用和定义的可执行语句 名字。这些引用遵循名称的正常规则 除未绑定局部变量为 在全局命名空间中查找。 这里“在全局名称空间中查找未绑定的局部变量”是什么意思?类定义是否可以位于另一个类定义或函数定义中,以便未绑定局部变量的查找不在全局命名空间中,而是在局部嵌套范围中 什么是“正常规则” 谢谢。举个例子:Python exec()和eval()的类定义块和参数的名称解析,python,python-3.x,Python,Python 3.x,从 类定义是可以使用和定义的可执行语句 名字。这些引用遵循名称的正常规则 除未绑定局部变量为 在全局命名空间中查找。 这里“在全局名称空间中查找未绑定的局部变量”是什么意思?类定义是否可以位于另一个类定义或函数定义中,以便未绑定局部变量的查找不在全局命名空间中,而是在局部嵌套范围中 什么是“正常规则” 谢谢。举个例子: x = 1 def foo(): x = 2 class Bar: print(x) x = 3 foo() # Output:
x = 1
def foo():
x = 2
class Bar:
print(x)
x = 3
foo()
# Output: 1
调用print()
时,x
是本地的(因为它在下一行中被赋值),但仍然是未绑定的,因为它是在赋值之前使用的
您可能希望在最近的命名空间(即2
)中查找未绑定的x
),但在类块中,“在全局命名空间中查找未绑定的局部变量”,因此会查找全局x
,并打印1
让我们删除
栏中的赋值:
x = 1
def foo():
x = 2
class Bar:
print(x)
foo()
# Output: 2
现在我们遵循“名称解析的正常规则”并获得输出2
,因为Bar
中的x
不再是局部变量(它是一个自由变量),而是在最近的封闭范围内查找
此外,在本地名称空间中查找未绑定局部变量的规则适用于类,但不适用于函数。让我们用一个函数来试试:
x = 1
def foo():
x = 2
def bar():
print(x)
x = 3
bar()
foo()
# Raises: UnboundLocalError: local variable 'x' referenced before assignment
正如您所见,在函数中,在为其赋值之前,您不能使用局部变量。您的链接提供了一个示例;在类A
中,对b
的赋值失败,因为列表理解使用了定义为类属性的A
,但不在全局范围内。该示例没有回答我的问题,但解释了其他一些问题:“类块中定义的名称范围仅限于类块;它不扩展到方法的代码块–这包括理解和生成器表达式,因为它们是使用函数范围实现的。“a
是生成器表达式内部的未绑定局部变量(不是列表理解,抱歉,我的错误),但class
语句不创建作用域。因此,生成器的封闭作用域不是类,而是全局作用域,因此生成器表达式看不到对a.a
的赋值。