Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python exec()和eval()的类定义块和参数的名称解析_Python_Python 3.x - Fatal编程技术网

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
的赋值。